Umkehr einer Liste (rekursiv)

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.
Benutzeravatar
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! ;)
Bottle: Micro Web Framework + Development Blog
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

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.
i ist ja strenggenommen auch kein "Input", es soll ja nicht beim Aufruf übergeben werden, sondern nur innerhalb der Funktion überschrieben werden.
Es geht bestimmt auch ohne i, aber ich denke die Variante ist relativ verständlich (while-ähnlich) und kommt ohne kompliziertere Gedankenvorgänge aus.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nocta hat geschrieben:Ich hoffe das hilft dir etwas mehr als EyDus Vorschlag :D
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

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!!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
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.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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]
Benutzeravatar
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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Aber natürlich darf bei so etwas reduce nicht fehlen:

Code: Alles auswählen

reduce(lambda xs, x: [x]+xs, [1,2,3], [])
@Defnull: Deine ist quasi meine Lösung. Nur von der anderen Richtung und if/else statt einem and.
Das Leben ist wie ein Tennisball.
Benutzeravatar
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))
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ist die Frage wo dann eure Lösungen rekursiv sind. Und nein, ich lasse bei ``fold`` nicht gelten dass es ja rekursiv sein könnte :D
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Leonidas hat geschrieben:Und nein, ich lasse bei ``fold`` nicht gelten dass es ja rekursiv sein könnte :D
Ich schon :D
Das Leben ist wie ein Tennisball.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Defnull hat geschrieben:Ganz abgesehen davon überschreibst du ein buildin. Böse! ;)
Schlimmer noch: Er "löscht" die Ausgangsliste.

Code: Alles auswählen

>>> l
[0, 1, 2]
>>> reversed(l)
[2, 1, 0]
>>> l
[]
MfG
HWK
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Und Haskell:

Code: Alles auswählen

reverse :: [a] -> [a]
reverse [] = []
reverse (x:xs) = reverse xs ++ [x]
MfG
HWK
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

HWK hat geschrieben:Schlimmer noch: Er "löscht" die Ausgangsliste.
Das lässt sich ja dokumentieren.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

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
lunar

Ocaml:

Code: Alles auswählen

let rec reverse = function
  | [] -> []
  | x :: xs -> (reverse xs) @ [x]
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Das ist das was ich an so einem Thread mag!
[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]
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

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
Die bisher coolste Lösung finde ich.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Defnull hat geschrieben:
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
Die bisher coolste Lösung finde ich.
Ja, gefällt mir auch gut. Ließe sich auch so schreiben:

Code: Alles auswählen

f = lambda a: f(a[len(a)/2:])+f(a[:len(a)/2]) if len(a)>1 else a
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

lunar hat geschrieben:Ocaml:

Code: Alles auswählen

let rec reverse = function
  | [] -> []
  | x :: xs -> (reverse xs) @ [x]
Danke für die Lösung. Ich war schon am verzweifeln, weil ich immer das hier versucht habe: [...]

Edit: Ich merke grade, dass meine Versuche noch viel schlimmer waren. Die behalte ich doch lieber für mich... :oops:
Antworten