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

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

@zsanzhar: wenn Du in jedem Schritt nur ein Buchstabenpaar austauschst, dann hast Du automatisch eine Schleife, bzw. Rekursion.
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

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.
Benutzeravatar
__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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__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.

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
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten