rekursiv reverse String ausgeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
zsanzhar
User
Beiträge: 19
Registriert: Samstag 17. Februar 2018, 21:28

Hallo,
könnte jemand bei meinem Code helfen, ich wäre sehr dankbar.

Ich habe den Code geschrieben

Code: Alles auswählen

def rev(s, l, r):
    if l == r:
        return s[r]
    return s[r]+rev[s,l, r-1] 
print(rev("Das Haus ist blau"), 3, 12)  
#mein Ergebnis ist "tsi suaH", aber ich ich brauche, dass mein Code "Das tsi suaH blau" ausgibt. Hätte jemand Ideen?


Vielen Dank!
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Bisher kümmert sich deine Funktion rev nur um die Buchstaben von l(inks) bis r(echts).
Vor dem letzen return muss halt Code sein, der die Buchstaben von 0 bis l-1 davor
und von r+1 bis Ende dahinter stellt.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn der Code, den Du gepostet hast, das Ergebnis liefert, dann programmierst Du kein Python, denn der Code ist voller Fehler.

Kannst Du mit Worten beschreiben, wie der Algorithmus arbeiten soll?
zsanzhar
User
Beiträge: 19
Registriert: Samstag 17. Februar 2018, 21:28

Sirius3 hat geschrieben: Sonntag 3. Juni 2018, 14:25 Wenn der Code, den Du gepostet hast, das Ergebnis liefert, dann programmierst Du kein Python, denn der Code ist voller Fehler.

Kannst Du mit Worten beschreiben, wie der Algorithmus arbeiten soll?
Mein Code soll die Zeichenfolge einer Zeichenkette s zwischen den Positionen l und r umdrehen, reverse(s, l, r). z.B. Zeichenfolge reverse("Das Haus ist grün", 3, 12). Der Code soll das als "Das tsi suaH grün" ausgeben. Aber mein Code gibt nur "tsi suaH" aus.
zsanzhar
User
Beiträge: 19
Registriert: Samstag 17. Februar 2018, 21:28

ThomasL hat geschrieben: Sonntag 3. Juni 2018, 13:45 Bisher kümmert sich deine Funktion rev nur um die Buchstaben von l(inks) bis r(echts).
Vor dem letzen return muss halt Code sein, der die Buchstaben von 0 bis l-1 davor
und von r+1 bis Ende dahinter stellt.
mmh, bei mir funktioniert irgendwie gar nicht :(
Benutzeravatar
__blackjack__
User
Beiträge: 14030
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zsanzhar: Wie sieht denn Dein Code bisher aus? Also Dein tatsächlicher Code, nicht das was Du im ersten Beitrag gezeigt hast. Und was funktioniert daran nicht? Warum nicht? Also an welcher Stelle liefert Dein Code etwas anderes als Du erwartest?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
zsanzhar
User
Beiträge: 19
Registriert: Samstag 17. Februar 2018, 21:28

__blackjack__ hat geschrieben: Sonntag 3. Juni 2018, 22:59 @zsanzhar: Wie sieht denn Dein Code bisher aus? Also Dein tatsächlicher Code, nicht das was Du im ersten Beitrag gezeigt hast. Und was funktioniert daran nicht? Warum nicht? Also an welcher Stelle liefert Dein Code etwas anderes als Du erwartest?
Mein Code soll die Zeichenfolge einer Zeichenkette s zwischen den Positionen l und r umdrehen, reverse(s, l, r). z.B. Zeichenfolge reverse("Das Haus ist grün", 3, 12). Der Code soll das als "Das tsi suaH grün" ausgeben. Aber mein Code gibt nur "tsi suaH" aus.

Code: Alles auswählen

def reverse(s,l,r):
                         if l == r:
                               return s[:l] +s[r]
                         return s[r]+reverse[s,l,r-1]
wenn ich reverse("Das Haus ist rot",3, 12) ausgeben will, liefert das als "tsi suaH Das", aber ich will dass mein Code "Das tsi suaH rot" ausgibt :(
zsanzhar
User
Beiträge: 19
Registriert: Samstag 17. Februar 2018, 21:28

__blackjack__ hat geschrieben: Sonntag 3. Juni 2018, 22:59 @zsanzhar: Wie sieht denn Dein Code bisher aus? Also Dein tatsächlicher Code, nicht das was Du im ersten Beitrag gezeigt hast. Und was funktioniert daran nicht? Warum nicht? Also an welcher Stelle liefert Dein Code etwas anderes als Du erwartest?
was ich im ersten Beitrag gezeigt habe, liefert nur von Position l bis Position r, also umdreht. Aber es soll bis Position l und nach der Position r , genau so bleiben und zusammen ausgeben
Benutzeravatar
__blackjack__
User
Beiträge: 14030
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zsanzhar: Die Funktion liefert gar kein Ergebnis, sondern einen Fehler. Und zwar einen `TypeError` weil die Funktion `reverse()` keine `__getitem__`-Methode hat. Du solltest schon tatsächlichen Code zeigen der auch zu Fehlermeldungen oder falschen/unerwarteten Ergebnissen passt, und nicht irgend etwas ähnliches.

Wenn man diesen offensichtlichen Fehler behebt, dann kommt bei dem Aufruf ' tsi suaHDas ' heraus. Also auch nur ungefähr das von dem Du behauptet hast was heraus kommt.

Was hast Du Dir denn bei dem Code gedacht? Beschreibe doch mal in Worten was der machen soll. Was ist der Rekursionsanker? Welches Teilproblem wird in jedem Rekursionsschritt gelöst?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
zsanzhar
User
Beiträge: 19
Registriert: Samstag 17. Februar 2018, 21:28

__blackjack__ hat geschrieben: Sonntag 3. Juni 2018, 23:17 @zsanzhar: Die Funktion liefert gar kein Ergebnis, sondern einen Fehler. Und zwar einen `TypeError` weil die Funktion `reverse()` keine `__getitem__`-Methode hat. Du solltest schon tatsächlichen Code zeigen der auch zu Fehlermeldungen oder falschen/unerwarteten Ergebnissen passt, und nicht irgend etwas ähnliches.

Wenn man diesen offensichtlichen Fehler behebt, dann kommt bei dem Aufruf ' tsi suaHDas ' heraus. Also auch nur ungefähr das von dem Du behauptet hast was heraus kommt.

Was hast Du Dir denn bei dem Code gedacht? Beschreibe doch mal in Worten was der machen soll. Was ist der Rekursionsanker? Welches Teilproblem wird in jedem Rekursionsschritt gelöst?
Ja, das Problem ist, das ich es nicht ganz verstehe...:( Bei meinem Cod e es wird immer vergliechen ob l ==r und wenn ja, wird ausgegeben. wenn nicht wird immer letzte Position + rekursions mit letzte Position-1 aufgeruft. Aber es wird nur umgedrehte Zeichenfolge zwischen l und r ausgegeben. Meine Frage wäre, wie ich es bis Position l und nach r zusammen ausgebe
zsanzhar
User
Beiträge: 19
Registriert: Samstag 17. Februar 2018, 21:28

__blackjack__ hat geschrieben: Sonntag 3. Juni 2018, 23:17 @zsanzhar: Die Funktion liefert gar kein Ergebnis, sondern einen Fehler. Und zwar einen `TypeError` weil die Funktion `reverse()` keine `__getitem__`-Methode hat. Du solltest schon tatsächlichen Code zeigen der auch zu Fehlermeldungen oder falschen/unerwarteten Ergebnissen passt, und nicht irgend etwas ähnliches.

Code: Alles auswählen

def reverse(s, l, r):
    if l == r:
        return s[r]
    return s[r] + reverse(s, l, r - 1)
Benutzeravatar
__blackjack__
User
Beiträge: 14030
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@zsanzhar: Was Dein Code tun soll, ist klar. Macht er aber nicht. Und jetzt mußt Du herausfinden, warum er nicht das macht, was Du willst, bzw. erklären, wie man denn rekursiv einen Teilstring umdrehen kann. Es hilft, wenn Du mal von Hand, auf Papier Schritt für Schritt den Text aufschreibst, l und r markierst, die Buchstaben austauschst, das neue l und r markierst usw.
zsanzhar
User
Beiträge: 19
Registriert: Samstag 17. Februar 2018, 21:28

Sirius3 hat geschrieben: Montag 4. Juni 2018, 05:07 @zsanzhar: Was Dein Code tun soll, ist klar. Macht er aber nicht. Und jetzt mußt Du herausfinden, warum er nicht das macht, was Du willst, bzw. erklären, wie man denn rekursiv einen Teilstring umdrehen kann. Es hilft, wenn Du mal von Hand, auf Papier Schritt für Schritt den Text aufschreibst, l und r markierst, die Buchstaben austauschst, das neue l und r markierst usw.
Klappt niiiicht :(.

Ich weiss nicht wie ich erklären sooll , ich verstehe nur wie mein Code nur von l bis r umdreht, andere Teile lässt einfach, aber ichh kann nicht irgendwie herausfinden :oops:
Benutzeravatar
__blackjack__
User
Beiträge: 14030
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
zsanzhar
User
Beiträge: 19
Registriert: Samstag 17. Februar 2018, 21:28

__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 :(
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
zsanzhar
User
Beiträge: 19
Registriert: Samstag 17. Februar 2018, 21:28

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.
zsanzhar
User
Beiträge: 19
Registriert: Samstag 17. Februar 2018, 21:28

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:]
Benutzeravatar
__blackjack__
User
Beiträge: 14030
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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten