Umkehrung eines Wortes

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.
lucky88
User
Beiträge: 4
Registriert: Sonntag 5. Juni 2011, 18:45

Hallo!
Ich bin ganz neu hier und hoffe einfach mal hier vielleicht Hilfe zu finden.
Wir müssen in unserem Studium programmieren und ich kann's einfach nicht... bisher bin ich immer irgendwie durchgekommen, aber nun hier eine Aufgabe, mit der ich nicht zurecht komme:

Für ein gegebenes Wort s wollen wir dessen Umkehrung bestimmen, d.h. das Wort, welches aus s entsteht, wenn man die Buchstaben von hinten nach vorne liest. Unsere Lösungsidee dazu (rekursiv!):
- Zerlege das Wort in seinen ersten Buchstaben und des Rest. Der Rest ist ein Wort kleinerer Länge.
- Bestimme die Umkehrung des Restes und hänge den ersten Buchstaben hinten an.
Spielen Sie diese rekursive Idee zuerst einmal für das Wort "Hallo" durch...

BITTE GANZ DRINGEND UM HILFE! :K :K

Schonmal DANKE!!
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

lucky88 hat geschrieben:Für ein gegebenes Wort s wollen wir dessen Umkehrung bestimmen, d.h. das Wort, welches aus s entsteht, wenn man die Buchstaben von hinten nach vorne liest.
Rekursion ist fast immer schlecht, wenn man es auch anders lösen könnte.

Code: Alles auswählen

value = 'Hallo'
print value[::-1]
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

lucky88 hat geschrieben:Spielen Sie diese rekursive Idee zuerst einmal für das Wort "Hallo" durch...
reverse("Hallo") => reverse("allo") + "H" => reverse("llo") + "a" + "H" => reverse("lo") + "l" + "a" + "H" => reverse("o") + "l" + "l" + "H" => reverse("") + "o" + "l" + "l" + "a" + "H"

Stefan

PS: Glaube "/me" nicht. Rekursion ist immer die eleganteste Lösung (und meist auch die einfachste).
Zuletzt geändert von sma am Sonntag 5. Juni 2011, 19:29, insgesamt 1-mal geändert.
BlackJack

@lucky88: In eurer eigenen Lösungsidee sprecht ihr euch selber mit „Sie” an!? ;-)

PS: Glaube sma nicht. Rekursion ist in Python eher selten die eleganteste Lösung. :-P
problembär

/me hat geschrieben:

Code: Alles auswählen

value = 'Hallo'
print value[::-1]
Sehr schön! Ich hätt's auf den ersten Blick in eine Liste umgewandelt und dann mit ".reverse()" gearbeitet, aber Deins ist viel schöner und daher besser.
Zen of Python hat geschrieben:There should be one-- and preferably only one --obvious way to do it.
Das ist dann wohl Deiner.

Gruß
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sma hat geschrieben:PS: Glaube "/me" nicht. Rekursion ist immer die eleganteste Lösung (und meiste auch die einfachste).
Dazu sage ich nur:

Code: Alles auswählen

RuntimeError: maximum recursion depth exceeded
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beim Wort "hallo" ist der erste Buchstabe "h", der Rest ist "allo", du kehrst den Rest um (durch einen rekursiven Aufruf) und hängst den ersten Buchstaben an dass Ende. Also gilt: reverse("hallo") = reverse("allo") + "h".

Man geht hierbei natürlich davon aus dass jeder String mindestens 1 Buchstaben hat, den ersten und alle die diesem Folgen.

Dementsprechend brauchst du noch eine weitere Bedingung für den Fall reverse(""), der in jedem Fall eintritt da wir nach obigem Beispiel irgendwann zu reverse("o") = reverse("") + "o" kommen.

Dies wird in der Haskell Lösung offensichtlich:

Code: Alles auswählen

reverse :: [a] -> [a]
reverse (x:xs) = reverse xs ++ [x]
Der Code funktioniert so nicht weil das Pattern (x:xs) nicht auf die leere Liste zutrifft. Dementsprechend braucht man noch:

Code: Alles auswählen

reverse [] = []
Man gibt einfach die leere Liste zurück da reverse("") = "".
lucky88
User
Beiträge: 4
Registriert: Sonntag 5. Juni 2011, 18:45

[quote="BlackJack"]@lucky88: In eurer eigenen Lösungsidee sprecht ihr euch selber mit „Sie” an!? ;-)/quote]

Habe quasi nur die Aufgabenstellung abgeschrieben :)

Wenn ich selbst ein Wort eingeben möchte (nicht zwingend "hallo") kann ich das doch auch so machen, oder?:

value = raw_input('Bitte Wort eingeben: ')
print value[::-1]

Das Problem ist, wir sollen das Wort ja in den ersten Buchstaben und den Rest zerlegen... Quasi 2 Listen?? Und dann den ersten hinten ran hängen? Ich verstehs nicht so ganz...
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Sorry Leute, aber mal 'ne blöde Frage:

Gelten nicht mehr? Dann können die Admins des Boardes ja das Sticky-Tag für die o.g Threads aufheben.
I'm not getting paid for being Mr. Nice Guy!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

BlackJack hat geschrieben:PS: Glaube sma nicht. Rekursion ist in Python eher selten die eleganteste Lösung. :-P
Pah! Glaube BlackJack nicht :) Ich führe DasIchs Beitrag als Beweis für die Eleganz der Rekursion an. Das Python ein willkürliches Limit der Rekursionstiefe implementiert ändert nichts daran, dass die rekursive Lösung elegant und einfach ist. Außerdem kann man problemlos "hallo" mit 5 Buchstaben umkehren ohne je von diesem Limit zu wissen.

PS: Vorschläge wie foo[::-1] sind wenig hilfreich, wenn man die Aufgabenstellung umsetzen will.

Stefan
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@querdenker: Und inwiefern denkst du, einen Regelverstoß entdeckt zu haben? Mal davon ab, dass Regeln keine verbindlichen Gesetze sind und man in Einzelfällen durchaus mal ein Auge zudrücken kann. Communitys, die eine zu arge Paragraphenreiterei betreiben, haben meist nicht das beste Klima (aus gutem Grund).

Zur Rekursion: Zwar ist das besagte Limit bei dem Wort `Hallo` noch kein Thema, es stellt jedoch eine deutliche Einschränkung dar und müsste bei einer ordentlichen Funktion auch in der Doku erwähnt werden. Denn so ganz undenkbar ist es bei den Anwendungfall ja nicht, dass man auch mal größere Strings übergeben möchte. Man kann doch hier sicher mit Schleifen arbeiten.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sma hat geschrieben:Das Python ein willkürliches Limit der Rekursionstiefe implementiert ändert nichts daran, dass die rekursive Lösung elegant und einfach ist. Außerdem kann man problemlos "hallo" mit 5 Buchstaben umkehren ohne je von diesem Limit zu wissen.
Ja, man kann. Man kann sich durchaus - und das ist jetzt nicht mal abwertend gemeint - von jedem Gedanken an Performance, Speicherverbrauch und Umsetzung innerhalb des Computers verabschieden.

Rekursion einzusetzen weil man die funktionale Programmierung für sich entdeckt hat und jetzt Rekursion noch toller findet als vorher ist für mich allerdings kein Grund. Es gibt durchaus Gründe für Rekursion. Wenn jemand allerdings die Fakultät mit Rekursion berechnet weil das so schön elegant ist, dann hat derjenige seinen Aufgabe als Softwareentwickler nicht verstanden.
sma hat geschrieben:PS: Vorschläge wie foo[::-1] sind wenig hilfreich, wenn man die Aufgabenstellung umsetzen will.
In der Frage stand doch nur "Unsere Lösungsidee dazu (rekursiv!)". Da stand nicht, dass es rekursiv umgesetzt werden muss.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

lucky88 hat geschrieben:Das Problem ist, wir sollen das Wort ja in den ersten Buchstaben und den Rest zerlegen... Quasi 2 Listen?? Und dann den ersten hinten ran hängen? Ich verstehs nicht so ganz...
Oh, Probleme mit Slicing? Dazu findet sich etwas im Tutorial unter http://docs.python.org/tutorial/introdu ... ml#strings.

Code: Alles auswählen

value = 'Hallo'
print value[:1]
print value[1:]
lucky88
User
Beiträge: 4
Registriert: Sonntag 5. Juni 2011, 18:45

Danke für eure nette Hilfe, nun hab ich's fertig und eigentlich ist es wenn man überlegt doch ganz simpel...

Werd mich nun aber nochmal ein bisschen durch's Internet und Tutorals lesen...

Aber um es abzuschließen hier der Code:

Code: Alles auswählen

value = raw_input ("Geben Sie ein Wort ein: ")  # Eingabe eines Wortes

a = value[:1]                           # Definieren des ersten Buchstabens
b = value[1:]                           # 1: definiert den Rest des Wortes

print a                                 # Zur Ueberprüfung: Erster Buchstabe
print b                                 # Zur Ueberprüfung: Rest des Wortes

print b[::-1] + a                # Umgekehrte Ausgabe: Rest des
                                        # Wortes + 1. Buchstabe
Müsste passen... :) Juhuuu
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

lucky88 hat geschrieben:Müsste passen... :) Juhuuu
Das hängt davon ab. Wenn es von der Aufgabenstellung her mit Rekursion sein sollte, dann ist die Lösung nicht korrekt. Wenn es nicht mit Rekursion sein braucht, dann ist es unnötig kompliziert.
BlackJack

@lucky88: Das ist sicher keine Lösung auf die es Punkte gibt. Die Vorschrift mit dem aufteilen von erstem Buchstaben und Rest des Wortes soll laut Aufgabenstellung ja rekursiv angewandt werden und nicht nur einmal.
lucky88
User
Beiträge: 4
Registriert: Sonntag 5. Juni 2011, 18:45

ach verdammt... das soll mit rekursion sein... argh :cry:
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du kannst einfach die Haskell Lösung zu Python übertragen, so schwer ist dass nicht.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

DasIch hat geschrieben:Du kannst einfach die Haskell Lösung zu Python übertragen, so schwer ist dass nicht.
Wenn man so gar keinen Ansatz hat, dann wirkt auch das schwer.

Ich liefere mal folgenden Ansatz bei dem nur noch die Rekursion ergänzt werden muss.

Code: Alles auswählen

def reverse(val):
    if val:
        return val[1:] + val[:1]
    return val

print reverse('Hallo')
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

/me hat geschrieben:
sma hat geschrieben:Das Python ein willkürliches Limit der Rekursionstiefe implementiert ändert nichts daran, dass die rekursive Lösung elegant und einfach ist. Außerdem kann man problemlos "hallo" mit 5 Buchstaben umkehren ohne je von diesem Limit zu wissen.
Ja, man kann. Man kann sich durchaus - und das ist jetzt nicht mal abwertend gemeint - von jedem Gedanken an Performance, Speicherverbrauch und Umsetzung innerhalb des Computers verabschieden.
Wenn der Interpreter nicht gut genug ist selbst einfachste Endrekursionen aufzulösen, dann ist das kein Problem von Rekusionen, sondern ein Problem des Interpreters.
Das Leben ist wie ein Tennisball.
Antworten