Seite 1 von 2
Re: rekursiv reverse String ausgeben
Verfasst: Montag 4. Juni 2018, 22:25
von zsanzhar
__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.
ohjeee, ich kann nicht irgendwie, rekursion ist bei mir neu

. Es muss immer selber aufrufen

Re: rekursiv reverse String ausgeben
Verfasst: Montag 4. Juni 2018, 22:34
von Sirius3
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?
Re: rekursiv reverse String ausgeben
Verfasst: Montag 4. Juni 2018, 23:02
von zsanzhar
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.
Re: rekursiv reverse String ausgeben
Verfasst: Montag 4. Juni 2018, 23:21
von zsanzhar
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?
ich habe es so bekommen, aber kein Rekursion und Schleife

.
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:]
Re: rekursiv reverse String ausgeben
Verfasst: Montag 4. Juni 2018, 23:30
von __blackjack__
Nee, Du hast es nicht hinbekommen, denn da kommt ein `UnboundLocalError` wenn man die Funktion aufruft.
Re: rekursiv reverse String ausgeben
Verfasst: Dienstag 5. Juni 2018, 06:41
von Sirius3
@zsanzhar: wenn Du in jedem Schritt nur ein Buchstabenpaar austauschst, dann hast Du automatisch eine Schleife, bzw. Rekursion.
Re: rekursiv reverse String ausgeben
Verfasst: Dienstag 5. Juni 2018, 11:19
von StareDog
ich soll die aufgabe ebenso lösen
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.
Re: rekursiv reverse String ausgeben
Verfasst: Dienstag 5. Juni 2018, 11:51
von __blackjack__
@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.
Re: rekursiv reverse String ausgeben
Verfasst: Donnerstag 7. Juni 2018, 11:01
von __blackjack__
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.
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)
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
#!/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