Umkehr einer Liste (rekursiv)
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
@DasIch: Willst du unsere Bemühungen, dem OP etwas bei zu bringen, zur Nichte machen oder hast du einfach nur den Thread nicht gelesen?
Ganz abgesehen davon überschreibst du ein buildin. Böse!
Ganz abgesehen davon überschreibst du ein buildin. Böse!
Bottle: Micro Web Framework + Development Blog
i ist ja strenggenommen auch kein "Input", es soll ja nicht beim Aufruf übergeben werden, sondern nur innerhalb der Funktion überschrieben werden.Defnull hat geschrieben:Der i Parameter ist eigentlich überflüssig, es sei denn, in-place ist Bedingung Die Liste oder Teilliste ist alles, was man als Input braucht.
Es geht bestimmt auch ohne i, aber ich denke die Variante ist relativ verständlich (while-ähnlich) und kommt ohne kompliziertere Gedankenvorgänge aus.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Also ich finde die Idee mit dem ``i`` jetzt nicht so sonderlich toll, um Rekursion zu verstehen. Zudem CPython keine Endrekursion optimiert bringt das ``i`` tatsächlich überhaupt nichts. Dadurch wird man eher durch irgendwelche Indexerei abgelenkt als durch die teilweise zerlegung in einfachere Probleme.Nocta hat geschrieben:Ich hoffe das hilft dir etwas mehr als EyDus Vorschlag
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Vielen Dank für euere hilfreichen Antworten!! Mit dem Code von Nocta hab ich jetzt genau, was ich wollte...
Wobei mich der Interesse halber schon noch interessieren würde, wie die Lösung von EyDu arbeitet....der kann ich als Anfänger leider garnicht folgen
Vielen Dank euch allen und ein schönes Wochenende!!
Wobei mich der Interesse halber schon noch interessieren würde, wie die Lösung von EyDu arbeitet....der kann ich als Anfänger leider garnicht folgen
Vielen Dank euch allen und ein schönes Wochenende!!
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Oder nach der Lösung das Ergebnis an die vorherige Rekursionsebene zurückliefern solltest (Wie beim Mergesort iirc). Gibt also zwei Möglichkeiten: Auf dem Weg in die Tiefe "Arbeit verrichten" (Qicksort) oder auf dem Weg zurück.Defnull hat geschrieben: Jeder Schritt muss dich näher ans Ziel bringen. Das heißt, das du in jeder Rekursionsstufe einen Teil des Problems lösen musst und nur den Rest rekursiv weiter reichen darfst.
inplace mit Vertauschen
Code: Alles auswählen
def reverse(seq, i=0):
if i < len(seq)/2:
seq[i],seq[-(i+1)] = seq[-(i+1)], seq[i]
reverse(seq, i+1)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Na jetzt ist es ja eh offen. Meine Lösung wäre gewesen:
Code: Alles auswählen
def stupidhomework(l):
return l[-1:] + stupidhomework(l[0:-1]) if l else []
Bottle: Micro Web Framework + Development Blog
Aber natürlich darf bei so etwas reduce nicht fehlen:
@Defnull: Deine ist quasi meine Lösung. Nur von der anderen Richtung und if/else statt einem and.
Code: Alles auswählen
reduce(lambda xs, x: [x]+xs, [1,2,3], [])
Das Leben ist wie ein Tennisball.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Na dann packen wir noch Scheme dazu
Code: Alles auswählen
(define (reverse alist)
(foldl cons '() alist))
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Schlimmer noch: Er "löscht" die Ausgangsliste.Defnull hat geschrieben:Ganz abgesehen davon überschreibst du ein buildin. Böse!
Code: Alles auswählen
>>> l
[0, 1, 2]
>>> reversed(l)
[2, 1, 0]
>>> l
[]
HWK
Und Haskell:MfG
HWK
Code: Alles auswählen
reverse :: [a] -> [a]
reverse [] = []
reverse (x:xs) = reverse xs ++ [x]
HWK
Divide-and-conquer darf natürlich nicht fehlen!
Code: Alles auswählen
def f(a):
if len(a) > 1:
m = len(a) / 2
return f(a[m:]) + f(a[:m])
return a
Ocaml:
Code: Alles auswählen
let rec reverse = function
| [] -> []
| x :: xs -> (reverse xs) @ [x]
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Die bisher coolste Lösung finde ich.bords0 hat geschrieben:Divide-and-conquer darf natürlich nicht fehlen!Code: Alles auswählen
def f(a): if len(a) > 1: m = len(a) / 2 return f(a[m:]) + f(a[:m]) return a
Bottle: Micro Web Framework + Development Blog
Ja, gefällt mir auch gut. Ließe sich auch so schreiben:Defnull hat geschrieben:Die bisher coolste Lösung finde ich.bords0 hat geschrieben:Divide-and-conquer darf natürlich nicht fehlen!Code: Alles auswählen
def f(a): if len(a) > 1: m = len(a) / 2 return f(a[m:]) + f(a[:m]) return a
Code: Alles auswählen
f = lambda a: f(a[len(a)/2:])+f(a[:len(a)/2]) if len(a)>1 else a
Danke für die Lösung. Ich war schon am verzweifeln, weil ich immer das hier versucht habe: [...]lunar hat geschrieben:Ocaml:Code: Alles auswählen
let rec reverse = function | [] -> [] | x :: xs -> (reverse xs) @ [x]
Edit: Ich merke grade, dass meine Versuche noch viel schlimmer waren. Die behalte ich doch lieber für mich...