Seite 2 von 2

Verfasst: Freitag 5. März 2010, 14:43
von jbs
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)

Verfasst: Freitag 5. März 2010, 14:45
von Defnull
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 []

Verfasst: Freitag 5. März 2010, 14:55
von EyDu
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.

Verfasst: Freitag 5. März 2010, 14:57
von cofi
Na dann packen wir noch Scheme dazu

Code: Alles auswählen

(define (reverse alist)
    (foldl cons '() alist))

Verfasst: Freitag 5. März 2010, 15:01
von Leonidas
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

Verfasst: Freitag 5. März 2010, 15:54
von EyDu
Leonidas hat geschrieben:Und nein, ich lasse bei ``fold`` nicht gelten dass es ja rekursiv sein könnte :D
Ich schon :D

Verfasst: Freitag 5. März 2010, 16:46
von HWK
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

Verfasst: Freitag 5. März 2010, 16:59
von HWK
Und Haskell:

Code: Alles auswählen

reverse :: [a] -> [a]
reverse [] = []
reverse (x:xs) = reverse xs ++ [x]
MfG
HWK

Verfasst: Freitag 5. März 2010, 17:13
von DasIch
HWK hat geschrieben:Schlimmer noch: Er "löscht" die Ausgangsliste.
Das lässt sich ja dokumentieren.

Verfasst: Freitag 5. März 2010, 20:50
von bords0
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

Verfasst: Freitag 5. März 2010, 21:43
von lunar
Ocaml:

Code: Alles auswählen

let rec reverse = function
  | [] -> []
  | x :: xs -> (reverse xs) @ [x]

Verfasst: Freitag 5. März 2010, 22:10
von jbs
Das ist das was ich an so einem Thread mag!

Verfasst: Freitag 5. März 2010, 22:20
von Defnull
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.

Verfasst: Freitag 5. März 2010, 22:34
von numerix
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

Verfasst: Freitag 5. März 2010, 22:35
von derdon
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:

Verfasst: Freitag 5. März 2010, 23:38
von Dackel
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
  }
...

Verfasst: Samstag 6. März 2010, 00:48
von Leonidas
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.

Verfasst: Sonntag 7. März 2010, 10:44
von BlackJack
Io fehlt noch:

Code: Alles auswählen

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