Qu'est-ce qu'une solution non récursive pour une séquence de type Fibonacci en Java?
Donné ce pseudo-code d'une fonction
f(0) = 1;
f(1) = 3;
f(n) = 3 * f(n - 1) - f(n - 2); //for n >= 2.
Est-il un non récursive façon de faire cela?
source d'informationauteur cclerville
Vous devez vous connecter pour publier un commentaire.
Ici les réponses sont correctes, mais ils travaillent en O(n), alors vous pouvez le faire en O(log n), de façon exponentielle plus rapide. Observer que
Let vn être le vecteur [f(n), f(n-1)] et la matrice ci-dessus, de sorte que vous obtenez vn = vn-1donc vn = An-1 v1. Calculer (n-1)-ième puissance de la matrice A l'aide de l'exponentiation binaire et de le multiplier par v1. Pour en savoir plus sur linéaire récidives voir ici.
Si votre question est de savoir si un équivalent non-définition récursive de la fonction peut être trouvé, vous devez rechercher les propriétés de la La suite de Fibonacci.
Votre séquence peut être constaté par écrit le Fibonacci (sans les 2 premiers chiffres) et la suppression de tous les 2ème numéro: 1, 3, 8, 21, 55, 144, ...
C'est simple, en Java, la solution ressemble à ceci:
Tous récursive des solutions peut être transformé en itératif solutions (l'inverse est vrai aussi, voir ce post), mais c'est plus facile si la solution récursive c'est en queue-de-forme récursive.
L'algorithme ci-dessus peut être comprise comme une programmation dynamique de la solution à l'origine de la récursivité, c'est très efficace car il a seulement besoin de sauver les deux valeurs précédentes à chaque point dans l'itération.
[ Oups, je pensais que c'était un Perl question. Encore, le code doit être lisible suffisant pour un développeur Java. ]
C'est vraiment juste le déplacement de la récursivité à l'espace utilisateur, mais vous pouvez utiliser:
Bien sûr, cela pose pour la mise en cache. Il n'y a pas besoin de recalculer les valeurs que nous savons déjà.
La fonction est définie en fonction d'elle-même, donc dans un sens, toute mise en œuvre est récursive, à moins qu'un mathématicien vient et nous dit
f(n)
peut être évalué sans évaluationf(n-1)
etf(n-2)
. Comme d'autres l'ont montré, il existe un moyen de le mettre en œuvre en Java fonction qui n'appelle pas lui-même.La suite de Fibonacci de la séquence de nombres commence comme: 0,1,1,2,3,5,8,13,21,34,55....
cela peut être défini par une simple relation de récurrence F(n)=F(n-1)+F(n-2) pour n>1 et de deux conditions initiales F(0)=1 et F(1)=1
Algorithme De Fibonacci
//Calcule le n-ième nombre de Fibonacci
//Entrée: Un entier non négatif
//Sortie: Le n-ième nombre de Fibonacci
Ici est simplement une fonction avec un minimum de ligne de code et un maximum de souplesse.
Vous pouvez ajouter toutes les "valeurs initiales" et de toute autre récursive de la fonction "" vous voulez tout simplement.
Et le résultat est:
Comme demandé par @paxdiablo je suis en train de faire cette réponse. C'est une relation de récurrence et peuvent être résolus de manière non-récursive, similaire à la séquence de fibonacci mentionné dans une autre réponse. Il s'avère être (Python notation).
Cependant, ce forumula ne plus probablement pas travail pour n grand, en raison de son manque de précision. La version de python échoue pour n = 30:
Avertissement: j'ai utilisé un "+" au lieu de "-", de sorte que la formule est fausse. Voir les commentaires.