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
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:
Dackel
User
Beiträge: 11
Registriert: Mittwoch 4. März 2009, 20:44

Ich versuch mich gerade an Scala. Da kann ich auch mal was beisteuern:

Code: Alles auswählen

...
def reverse(l: List[Any]): List[Any] = l match {
    case List() => l
    case _ => reverse(l.tail) ::: l.head
  }
...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hier eine (etwas gecheatete) Lösung in Factor. Entspricht quasi 1:1 der Scheme-Lösung.

Code: Alles auswählen

USING: sequences syntax ;
IN: reverser

: reverse ( seq -- newseq ) { } [ prefix ] reduce ;
(Ist schon erstaunlich wie kurz Factor-Code sein kann)

Der Vollständigkeit halber hier der Code der von Factor genutzt wird (self-hosting hat schon Vorteile, zweifellos):

Code: Alles auswählen

USING: kernel ;
IN: sequences
: reverse ( seq -- newseq )
    [
        dup [ length ] keep new-sequence [ 0 swap copy ] keep
        reverse!
    ] keep like ;
Ist allerdings nichtmal ansatzweise rekursiv.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Io fehlt noch:

Code: Alles auswählen

List myReverse := method(
    if(self isEmpty, List clone, self slice(0, -1) myReverse prepend(self last))
)
Antworten