ohjeee, ich kann nicht irgendwie, rekursion ist bei mir neu . Es muss immer selber aufrufen__blackjack__ hat geschrieben: ↑Montag 4. Juni 2018, 00:22 @zsanzhar: Der Code macht so keinen Sinn. Bei l == r wird nichts ausgegeben, sondern etwas zurückgegeben. Warum gibst Du dort s[r] zurück? Was bedeutet das denn in Worten, also sowohl die Bedingung, als auch das was zurückgegeben wird?
Wie gesagt: Beschreibe doch mal in Worten was da in jedem Rekursionsschritt passieren soll/muss und was der Rekursionsanker ist, und was in dem Fall passieren soll/muss.
rekursiv reverse String ausgeben
Nimm ein Karopapier, Schreibe in jedes Kästchen einen Buchstaben, mal einen Pfeil an das 4. und 13. Kästchen, Schreibe dann die Buchstaben in die nächste Zeile, wobei Du zwei davon vertauschst und überlege Dir dann, wo Du als nächstes die Pfeilchen hinmalen würdest. Wie oft wiederholst Du das, bis das Ergebnis dasteht?
Sirius3 hat geschrieben: ↑Montag 4. Juni 2018, 22:34 Nimm ein Karopapier, Schreibe in jedes Kästchen einen Buchstaben, mal einen Pfeil an das 4. und 13. Kästchen, Schreibe dann die Buchstaben in die nächste Zeile, wobei Du zwei davon vertauschst und überlege Dir dann, wo Du als nächstes die Pfeilchen hinmalen würdest. Wie oft wiederholst Du das, bis das Ergebnis dasteht?
__blackjack__ hat geschrieben: ↑Montag 4. Juni 2018, 22:16 Wie würdest Du denn Schritt für Schritt vorgehen wenn Du die Zeichenkette von l bis r umdrehen müsstest? Ich glaube ich schlage jetzt bereits zum 3. mal vor das einfach mal in Worten zu beschreiben was bei jedem Schritt gemacht werden muss, und woran man erkennen kann das man fertig ist. Solange Du das nicht beschreiben kannst, wirst Du das auch nicht als Code beschreiben können. Und das ist einer der Fälle bei denen man schlecht helfen kann ohne einfach die Aufgabe für Dich zu lösen, denn eigentlich ist das recht trivial.
Wenn das mit der Rekursion Probleme bereitet, kannst Du es auch einfach erst einmal iterativ erklären, denn so eine Schleife lässt sich am Ende ja auch rekursiv ausdrücken wenn man erst einmal die Idee für den einzelnen Schritt hat.
ok, dankeschön für deine Hilfe, ich habe es wirklich mehrmals versucht. Ich lasse es einfach so.
ich habe es so bekommen, aber kein Rekursion und Schleife .Sirius3 hat geschrieben: ↑Montag 4. Juni 2018, 22:34 Nimm ein Karopapier, Schreibe in jedes Kästchen einen Buchstaben, mal einen Pfeil an das 4. und 13. Kästchen, Schreibe dann die Buchstaben in die nächste Zeile, wobei Du zwei davon vertauschst und überlege Dir dann, wo Du als nächstes die Pfeilchen hinmalen würdest. Wie oft wiederholst Du das, bis das Ergebnis dasteht?
eine Liste umgedrehte von l bis r. u nd alles ausgeben lassen:(
Code: Alles auswählen
def rev(s,l,r):
a = a[l:r][::-1]
return s[:l+1] + a + s[r:]
- __blackjack__
- User
- Beiträge: 13100
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Nee, Du hast es nicht hinbekommen, denn da kommt ein `UnboundLocalError` wenn man die Funktion aufruft.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ich soll die aufgabe ebenso lösen
Zu meinem Code/Gedankengang
wenn ich den das wort bis Stelle l+1 erzeugt habe, kann ich auch das wort l hinzufügen. Da ich aber das wort bis l+1 noch nichtg weiß muss ich den buchstaben l+1 herausfinden und dazu rufe ich l+2 auf, bis der letzte Buchstabe in meinem Fall s[l] = s[r] =14 gefunden wurde und dann die erste Ziffer der Lösung ist und somit dann die weiteren Buchstaben des wortes angefügt werden können vom algorithmus.
ich weiß nicht, aber ich lese heraus, dass ihr meint, dass in jedem schritt zwei buchstaben miteinander getauscht werden sollen?
3-14
4-13
5-12
6-11
7-10
8-9
das heißt 6 Schritte und der Rekursionsabbruch findet statt wenn r = l+1 ist.
Code: Alles auswählen
s ="Das Haus ist blau"
def reverse(s,l,r):
if l == r:
return s[l]
else:
return str(reverse(s,l+1,r))+s[l]
print(reverse(s,3,14))
Zu meinem Code/Gedankengang
wenn ich den das wort bis Stelle l+1 erzeugt habe, kann ich auch das wort l hinzufügen. Da ich aber das wort bis l+1 noch nichtg weiß muss ich den buchstaben l+1 herausfinden und dazu rufe ich l+2 auf, bis der letzte Buchstabe in meinem Fall s[l] = s[r] =14 gefunden wurde und dann die erste Ziffer der Lösung ist und somit dann die weiteren Buchstaben des wortes angefügt werden können vom algorithmus.
ich weiß nicht, aber ich lese heraus, dass ihr meint, dass in jedem schritt zwei buchstaben miteinander getauscht werden sollen?
3-14
4-13
5-12
6-11
7-10
8-9
das heißt 6 Schritte und der Rekursionsabbruch findet statt wenn r = l+1 ist.
- __blackjack__
- User
- Beiträge: 13100
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@StareDog: In dem konkreten Beispiel ist die Rekursion zu ende wenn r == l + 1 ist, das muss aber nicht bei jeder Eingabe der Fall sein.
Man kann das auch anders lösen als durch vertauschen von einem Buchstabenpaar pro Iterationsschritt, aber das wäre dann IMHO komplizierter. Das einzige ”Problem” bei Python ist, das Zeichenketten unveränderbar sind, womit das Buchstaben vertauschen ineffizient ist. Aber das rekursiv zu lösen ist ja eh schon keine Python-Lösung.
Man kann das auch anders lösen als durch vertauschen von einem Buchstabenpaar pro Iterationsschritt, aber das wäre dann IMHO komplizierter. Das einzige ”Problem” bei Python ist, das Zeichenketten unveränderbar sind, womit das Buchstaben vertauschen ineffizient ist. Aber das rekursiv zu lösen ist ja eh schon keine Python-Lösung.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
- __blackjack__
- User
- Beiträge: 13100
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Hier mal die „vertausche zwei Zeichen in jedem Rekursionsschritt“-Variante in Io implementiert. Io hat im Gegensatz zu Python auch Zeichenketten die veränderbar sind, weshalb das nicht ganz so ineffizient ist wie in Python.
Die Alternative wäre im Rekursionsschritt den Präfix der nicht umgedreht werden soll, gefolgt vom Buchstaben am zweiten Index, gefolgt vom umgedrehten Teil zwischen den beiden Indizes (Rekursiver aufruf), gefolgt vom Buchstaben am ersten Index, gefolgt vom Suffix der nicht umgedreht werden soll, zu bestimmen. Das mit Prä- und Suffix ist eigentlich nur beim ersten Aufruf nötig, denn in jedem rekursiven Aufruf sind diese beiden Teilzeichenketten leer. Der Ansatz als Bash-Skript:
Code: Alles auswählen
#!/usr/bin/env io
Sequence swap := method(i, j,
tmp := self at(i)
self atPut(i, self at(j))
self atPut(j, tmp)
)
reverse := method(sequence, start, end,
if(start >= end,
sequence
,
reverse(sequence swap(start, end), start + 1, end - 1)
)
)
main := method(reverse("Das Haus ist grün." asMutable, 3, 12) println)
isLaunchScript ifTrue(main)
Code: Alles auswählen
#!/bin/bash
Reverse() {
local string=$1
local start=$2
local end=$3
if (( start >= end )); then
echo "$string"
else
local prefix=${string:0:start}
local left_character=${string:start:1}
local middle=${string:start+1:end-start-1}
local reversed_middle=$(Reverse "$middle" 0 $(( ${#middle} - 1 )))
local right_character=${string:end:1}
local suffix=${string:end+1}
echo "$prefix$right_character$reversed_middle$left_character$suffix"
fi
}
Reverse 'Das Haus ist grün.' 3 12
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman