Génération de la suite de Fibonacci en Lisp utilise la récursivité?
Je suis un newbie en LISP. Je suis en train d'écrire une fonction dans CLISP pour générer des n premiers nombres de la suite de Fibonacci.
C'est ce que j'ai fait jusqu'à présent.
(defun fibonacci(n)
(cond
((eq n 1) 0)
((eq n 2) 1)
((+ (fibonacci (- n 1)) (fibonacci (- n 2))))))))
Le programme imprime le n-ième nombre de Fibonacci de la série. Je suis en train de le modifier pour qu'il affiche la série, et pas seulement le n-ième terme.
Est-il possible de le faire en une seule fonction récursive, en utilisant seulement les fonctions de base?
OriginalL'auteur wackyTechie | 2014-04-14
Vous devez vous connecter pour publier un commentaire.
Oui:
La logique derrière cela est que vous devez connaître les deux numéros précédents pour générer le prochain.
Au lieu de revenir à seulement un résultat, je cumuler tous les
a
-s jusqu'à ce quen
est égale à zéro.MODIFIER Sans inverse c'est un peu plus inefficace:
Vous devez mentionner les restrictions dans votre question. J'ai ajouté la manière de le faire sans un accumulateur.
Ouais, réalisé plus tard. Merci beaucoup!
OriginalL'auteur Sylwester
Ce programme n'a pas d'imprimer quoi que ce soit. Si vous êtes voyant de sortie, c'est probablement parce que vous êtes en l'appelant depuis le read-eval-impression-boucle (REPL), qui se lit d'une forme, évalue, et puis imprime le résultat. E. g., vous pourriez être en train de faire:
Si vous avez enveloppé cet appel à quelque chose d'autre, mais vous, vous verrez que ce n'est pas l'impression de rien:
Que vous avez écrit, il sera difficile de le modifier pour imprimer un nombre de fibonacci juste une fois, puisque vous faites beaucoup de calcul redondant. Par exemple, l'appel à
permettra de calculer
(fibonacci (- n 1))
, mais ce sera l'appel direct àCela signifie que vous ne voulez probablement pas à chaque appel
fibonacci
pour imprimer l'ensemble de la séquence. Si vous le faites, cependant, noter que(print x)
renvoie la valeur dex
, de sorte que vous pouvez tout simplement faire:Vous allez voir quelques répété pièces de il y, car il est redondant de calcul. Vous pouvez calculer la série de manière beaucoup plus efficace, cependant, en commençant par les deux premiers numéros, et en comptant jusqu':
OriginalL'auteur Joshua Taylor
Une option pour garder la structure de base utilisée est de passer un indicateur supplémentaire de la fonction qui indique si vous souhaitez que l'impression ou non:
L'idée est que lorsque vous avez les deux appels récursifs que dans le premier vous passe le drapeau à propos de faire de l'impression et dans le deuxième appel à la place que vous venez de passer NÉANT pour éviter d'imprimer à nouveau.
OriginalL'auteur 6502