endrekursives Fibonacci in Haskell

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Benutzeravatar
Blade Runner
User
Beiträge: 21
Registriert: Montag 23. Februar 2009, 11:41

Ich find irgendwie kein Haskellforum, aber da hier auch einige Haskell können kann mir vielleicht jemand sagen warum das nur die leere Liste zurückgibt:

Code: Alles auswählen

fib 1000 _ = []
fib _ [] = []
fib n l = fib (n + 1) (l ++ [(last l + last (init l))])
[quote="Roy Batty"]All those moments will be lost in time, like tears in rain ... time to die.[/quote]
BlackJack

@Blade Runner: Erklär mal bitte den ersten Fall. Vielleicht löst das ja schon das Problem. (Den Rest habe ich mir gar nicht erst angeschaut.)

Edit: Okay, ich habe mir den Rest angeschaut, und äh, Häh? Erkläre mal mehr als den ersten Fall. Vielleicht mal alle drei, und dann an einem Beispiel durchgerechnet wie man meinetwegen die 5. Fibonacci-Zahl damit ausrechne. Also den Ausgangsfall und dann wie man durch wiederholtes ersetzen und ausrechnen dann zu dem Ergebnis kommt.
Benutzeravatar
Blade Runner
User
Beiträge: 21
Registriert: Montag 23. Februar 2009, 11:41

Meine Idee ist dass ich eine Liste erzeuge mit einer gewissen Anzahl an fibonaccizahlen. Also übergebe ich die Liste in der die Anfangszahlen enthalten sind, nehm das letzte und vor letzte Element, häng die Summe an die Liste an und übergeb das ganze dann wieder an die Funktion, sodass die Liste pro Durchlauf länger wird. Im nächsten Funktionsaufruf sollte dann eben die Liste um ein Element angewachsen sein.

Die ersten zwei Zeilen sollen eine Fallunterscheidung darstellen... zumindest nach meinem lückenhaften Haskellverständnis. :D

Edith: Verdammt, ich glaub ich weiß warum die leere Liste zurückgegeben wird... der Zähler erreicht n und die Rückgabe wird dann einfach auf [] gesetzt. Prinzipiell müsste ja die ganze Liste zurückgegeben werden.

TL;DR: Berechnung stimmt, falsches "if".

Edith 2: Du hattest Recht, ich hab mich in der ersten Zeile verschrieben... ;)
[quote="Roy Batty"]All those moments will be lost in time, like tears in rain ... time to die.[/quote]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Blade Runner hat geschrieben:Die ersten zwei Zeilen sollen eine Fallunterscheidung darstellen... zumindest nach meinem lückenhaften Haskellverständnis. :D

Code: Alles auswählen

fib 1000 _ = []
fib _ [] = []
Das macht irgendwie nicht wirklich viel Sinn, denn das heißt ja, dass wenn du als n für fib 1000 übergibst, dann ist das Ergebnis die leere Liste. Und für jedes n gilt wenn du als Akkumulator [] verwendest dann ist das Ergebnis [], was auch nicht unbedingt stimmen muss.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hier mal als Tipp eine Lösung in OCaml:

Code: Alles auswählen

let rec fibs n acc = match n with
  | 0 -> acc
  | l -> let (fst,snd) = acc in
    fibs (l-1) (snd, fst+snd)

let fib n =
  let (r, _) = fibs n (0, 1) in
  r
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten