Je pense que vous venez de faire une faute de frappe. Voici ce que votre fonction fibgen
ressemble reformaté:
(fn fibgen [a b]
(cons a (fibgen b (+ a b)))
0
1)
Cette fonction réalise toute la séquence de Fibonacci commençant par a
et b
, puis retourne 1. Qu'est-ce que vous vouliez dire à faire était de définir une fonction qui retourne la séquence, appel avec 0 et 1, puis prendre les dix premiers éléments de cette séquence:
(take 10 ((fn fibgen [a b] (cons a (fibgen b (+ a b)))) 0 1))
Si vous exécutez, vous obtiendrez un ArithmeticException
pour débordement d'entier, parce que les numéros dans la séquence de Fibonacci quittent rapidement le r ange d'un entier de 64 bits. Vous pouvez résoudre ce problème en utilisant +'
:
(take 10 ((fn fibgen [a b] (cons a (fibgen b (+' a b)))) 0 1))
Depuis Clojure est pas paresseux, cela va essayer de réaliser la séquence de Fibonacci toute, ce qui entraînera une StackOverflowError
. Même si Clojure est lui-même pas paresseux, cependant, vous pouvez créer un lazy sequence, qui aura essentiellement le même effet dans ce cas:
(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)
vous n'appelez la fonction, et si vous ne l'appellent il a gagné ne soyez pas paresseux – noisesmith
@noisesmith Je vois maintenant en effet. :) –