Ich denke, Sie haben gerade einen Tippfehler gemacht. Hier ist, was Ihre fibgen
Funktion wie neu formatiert aussieht:
(fn fibgen [a b]
(cons a (fibgen b (+ a b)))
0
1)
Diese Funktion realisiert die gesamte Fibonacci-Folge, beginnend mit a
und b
, dann kehrt 1. Was Sie zu tun war, bedeutete eine Funktion definieren, die die Sequenz zurückgibt, Anruf mit 0 und 1, und nehmen dann die ersten zehn Elemente aus dieser Sequenz:
(take 10 ((fn fibgen [a b] (cons a (fibgen b (+ a b)))) 0 1))
Wenn Sie dies ausführen, erhalten Sie eine ArithmeticException
für integer-Überlauf kommen, da Zahlen in der Fibonacci-Folge schnell die r verlassen Ange einer 64-Bit-Ganzzahl. Sie können dies mit +'
beheben:
(take 10 ((fn fibgen [a b] (cons a (fibgen b (+' a b)))) 0 1))
Da Clojure nicht faul ist, wird dies versuchen, die gesamte Fibonacci-Folge zu realisieren, die eine StackOverflowError
verursachen. Auch wenn Clojure selbst nicht faul ist, aber Sie können erstellen lazy sequence, die im Grunde die gleiche Wirkung in diesem Fall haben:
(take 10 ((fn fibgen [a b] (lazy-seq (cons a (fibgen b (+' a b))))) 0 1))
;;=> (0 1 1 2 3 5 8 13 21 34)
Sie nie die Funktion aufrufen, und wenn Sie es nennen es gewonnen bin nicht faul – noisesmith
@noissmith ich sehe jetzt tatsächlich. :) –