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!!
Umkehrung eines Wortes
Rekursion ist fast immer schlecht, wenn man es auch anders lösen könnte.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.
Code: Alles auswählen
value = 'Hallo'
print value[::-1]
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"lucky88 hat geschrieben:Spielen Sie diese rekursive Idee zuerst einmal für das Wort "Hallo" durch...
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.
@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.
PS: Glaube sma nicht. Rekursion ist in Python eher selten die eleganteste Lösung.
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./me hat geschrieben:Code: Alles auswählen
value = 'Hallo' print value[::-1]
Das ist dann wohl Deiner.Zen of Python hat geschrieben:There should be one-- and preferably only one --obvious way to do it.
Gruß
Dazu sage ich nur:sma hat geschrieben:PS: Glaube "/me" nicht. Rekursion ist immer die eleganteste Lösung (und meiste auch die einfachste).
Code: Alles auswählen
RuntimeError: maximum recursion depth exceeded
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:
Der Code funktioniert so nicht weil das Pattern (x:xs) nicht auf die leere Liste zutrifft. Dementsprechend braucht man noch:
Man gibt einfach die leere Liste zurück da reverse("") = "".
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]
Code: Alles auswählen
reverse [] = []
[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...
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...
-
- 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.
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!
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.BlackJack hat geschrieben:PS: Glaube sma nicht. Rekursion ist in Python eher selten die eleganteste Lösung.
PS: Vorschläge wie foo[::-1] sind wenig hilfreich, wenn man die Aufgabenstellung umsetzen will.
Stefan
@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.
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.
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.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.
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.
In der Frage stand doch nur "Unsere Lösungsidee dazu (rekursiv!)". Da stand nicht, dass es rekursiv umgesetzt werden muss.sma hat geschrieben:PS: Vorschläge wie foo[::-1] sind wenig hilfreich, wenn man die Aufgabenstellung umsetzen will.
Oh, Probleme mit Slicing? Dazu findet sich etwas im Tutorial unter http://docs.python.org/tutorial/introdu ... ml#strings.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...
Code: Alles auswählen
value = 'Hallo'
print value[:1]
print value[1:]
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:
Müsste passen... Juhuuu
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
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.lucky88 hat geschrieben:Müsste passen... Juhuuu
@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.
Wenn man so gar keinen Ansatz hat, dann wirkt auch das schwer.DasIch hat geschrieben:Du kannst einfach die Haskell Lösung zu Python übertragen, so schwer ist dass nicht.
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')
Wenn der Interpreter nicht gut genug ist selbst einfachste Endrekursionen aufzulösen, dann ist das kein Problem von Rekusionen, sondern ein Problem des Interpreters./me hat geschrieben: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.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.
Das Leben ist wie ein Tennisball.