Java récursif de la suite de Fibonacci
Veuillez expliquer ce simple code:
public int fibonacci(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
Je suis confondue avec la dernière ligne surtout parce que, si n = 5 par exemple, puis de fibonacci(4) + fibonacci(3) seraient appelés et ainsi de suite, mais je ne comprends pas comment cet algorithme calcule la valeur à l'indice 5 par cette méthode. Veuillez expliquer avec beaucoup de détails!
- Notez que c'est récursive et s'exécute en temps exponentiel. Il est inefficace pour de grandes valeurs de N. en Utilisant une approche itérative, j'ai été en mesure de calculer les 10 000 premiers nombres de la séquence. Ils peuvent être trouvés ici - goo.gl/hnbF5
- Pouvez-vous s'il vous plaît partager le code que vous avez utilisé pour le calcul de 10 000 numéros dans l'ordre ? Je suis vraiment curieux de le savoir.
- Le lien que vous avez évoqué est mort.
- Cette vidéo vous explique à comprendre la fonction récursive dans les 10 minutes youtube.com/watch?v=t4MSwiqfLaY
- Jetez un oeil à la mine de solution.Optimisé pour l'appel récursif je suis un peu surpris de voir que nulle part cette approche est mentionné sur le net
- Pour les futurs lecteurs, ici, est le saint graal de traçage double récursivité: youtube.com/watch?v=PT0mS3thy6Q&t=36s
- Il y a aussi une approche Itérative qui pourrait être moins difficile pour vous. Excellent article sur les deux Récursif et Itératif avec le code ici - codeflex.co/java-get-fibonacci-nombre-par-index
- Vous devez également retourner -1 si n est inférieur à 0, ou vous obtiendrez une erreur.
Vous devez vous connecter pour publier un commentaire.
Dans la séquence de fibonacci chaque élément est la somme des deux précédents. Donc, vous avez écrit un algorithme récursif.
Donc,
Maintenant, vous savez déjà
fibonacci(1)==1 and fibonacci(0) == 0
. Ainsi, vous pouvez par la suite de calculer les autres valeurs.Maintenant,
Et de la suite de fibonacci
0,1,1,2,3,5,8,13,21....
nous pouvons voir que pour5th element
la séquence de fibonacci retourne5
.Voir ici pour La Récursivité Tutoriel.
Il y a 2 problèmes avec votre code:
Le code
fibonacci(n - 1) + fibonacci(n - 2)
qui est très mauvais.
Le problème est que l'on appelle de fibonacci pas 50 fois, mais beaucoup plus.
Au premier abord, les appels de fibonacci(49)+fibonacci(48),
à côté de fibonacci(48)+fibonacci(47) et fibonacci(47)+fibonacci(46)
Chaque fois, il est devenu fibonacci(n) le pire, si la complexité est exponentielle.
L'approche de la non-récursive code:
2*fibonacci(n+1)-1
, de sorte qu'il grandit avec la même complexité que les nombres de fibonacci, qui, lui, est 1.618^n au lieu de 2^nEn pseudo code, où n = 5, les événements suivants se produisent:
Ce qui se décompose en:
Ce qui se décompose en:
Ce qui se décompose en:
Ce qui se décompose en:
Il en résulte: 5
Compte tenu de la fibonnacci séquence est 1 1 2 3 5 8 ..., le 5ème élément est 5. Vous pouvez utiliser la même méthodologie pour comprendre les autres itérations.
La récursivité peut être difficile à comprendre parfois. Simplement évaluer sur un morceau de papier pour un petit nombre:
Je ne suis pas sûr de savoir comment Java en fait évalue cela, mais le résultat sera le même.
Vous pouvez également simplifier votre fonction, comme suit:
Point Important à noter est cet algorithme est exponentielle car il ne permet pas de stocker le résultat de la précédente, calculé en nombre. par exemple F(n-3) est appelé 3 fois.
Pour plus de détails, se reporter algorithme par dasgupta chapitre 0.2
La plupart des réponses sont bonnes et explique comment la récursivité dans de fibonacci œuvres.
Ici est une analyse sur les trois techniques qui comprend la récursivité ainsi:
Voici mon code pour tester tous les trois:
Voici les résultats:
Par conséquent, nous pouvons voir memoization est le meilleur temps sage et pour la boucle correspond à près.
Mais la récursivité est la plus longue et peut-être que vous devez éviter dans la vie réelle. Aussi, si vous êtes en utilisant la récursivité assurez-vous d'optimiser la solution.
C'est la meilleure vidéo que j'ai trouvé qui explique entièrement la récursivité et la suite de Fibonacci en Java.
http://www.youtube.com/watch?v=dsmBRUCzS7k
C'est son code pour la séquence et son explication est mieux que je ne pourrais jamais le faire en essayant de type il.
De fibonacci solution récursive, il est important d'enregistrer la sortie de plus petits nombres de fibonacci, lors de la récupération de la valeur du plus grand nombre. Ceci est appelé "Memoizing".
Voici un code qui utilisent memoizing la plus petite de fibonacci valeurs, tout en récupérant plus grand nombre de fibonacci. Ce code est efficace et n'est pas de faire de multiples demandes de la même fonction.
Michael Goodrich et al fournir un vraiment intelligent de l'algorithme dans des Structures de Données et Algorithmes en Java, pour la résolution de fibonacci de manière récursive en temps linéaire par retour un tableau [fib(n), fib(n-1)].
Cela donne fib(n) = fibGood(n)[0].
dans le fibonacci de la séquence, les deux premiers éléments sont 0 et 1, chaque autre élément est la somme des deux éléments précédents. j'.e:
0 1 1 2 3 5 8...
donc le 5ème élément est la somme de la 4e et la 3e éléments.
Un Fibbonacci séquence est celle qui sommes le résultat d'un certain nombre lorsqu'il est ajouté au résultat précédent, en commençant par 1.
Une fois que nous comprenons ce que Fibbonacci est, on peut commencer à briser le code.
La première si tresorerie vérifie la base de cas, où la boucle peut sortir. L'autre si l'instruction ci-dessous qui est en train de faire la même chose, mais il pourrait être ré-écrite comme si...
Maintenant que le cas de base est d'établir que nous avons à comprendre la pile d'appel.Votre premier appel à "fibonacci" sera la dernière à résoudre sur la pile (séquence d'appels) comme ils résoudre dans l'ordre inverse à partir de laquelle ils ont été appelés. La dernière méthode est appelée à se résout en premier, puis le dernier à être appelée avant que l'un et ainsi de suite...
Ainsi, tous les appels sont effectués en premier avant que quelque chose est "calculé" avec ces résultats. Avec une entrée de 8, nous nous attendons à une sortie de 21 ans (voir le tableau ci-dessus).
fibonacci(n - 1) continue à être appelé jusqu'à ce qu'il atteigne le cas de base, puis de fibonacci(n - 2) est appelé jusqu'à ce qu'il atteigne le cas de base. Lorsque la pile commence à en additionnant le résultat dans l'ordre inverse, le résultat sera comme si...
Ils gardent bouillonnants (résolution à l'envers) jusqu'à jusqu'à ce que la somme est rendue au premier appel de la pile et c'est la façon dont vous obtenez votre réponse.
Cela dit, cet algorithme est très inefficace, car il calcule le même résultat pour chaque branche le code se divise en. Une meilleure approche est un "bottom up" où aucune Memoization (en cache) ou de la récursivité (profondeur de la pile d'appel) est nécessaire.
Comme si...
La plupart des solutions proposées ici s'exécuter en O(2^n) la complexité. Le recalcul des nœuds identiques récursive de l'arbre est inefficace et les déchets de cycles CPU.
Nous pouvons utiliser memoization pour faire fonction de fibonacci s'exécuter en O(n) le temps
Si nous suivons Bottom-Up Dynamique de Programmation de la route, code ci-dessous est assez simple à calculer fibonacci:
Pourquoi cette réponse est différente
Tous les autres de réponse:
(côté: aucun d'eux n'est réellement efficace; utilisation La formule de Binet pour calculer directement le nème terme)
Queue Récursive Fib
Ici est une approche récursive qui évite une double-appel récursif en passant à la fois la réponse précédente ET celle d'avant.
C'est une séquence de base que l'affichage ou obtenir une sortie de
1 1 2 3 5 8
c'est une séquence que la somme du numéro précédent, le nombre actuel s'affiche à l'écran suivant.
Essayer de regarder le lien ci-dessous Java Récursif de la suite de Fibonacci Tutoriel
Cliquez Ici Regarder Java Récursif de la suite de Fibonacci Tutoriel pour l'alimentation à la cuillère
Je pense que c'est une manière simple:
RanRag(accepté) réponse du bon travail, mais ce n'est pas une solution optimale jusqu'à ce que et à moins qu'il est mémorisé comme l'explique Anil réponse.
Récursive de considérer ci-dessous approche, les appels de méthode de
TestFibonacci
sont minimumÀ l'aide d'un interne ConcurrentHashMap qui, théoriquement, pourrait permettre d'
cette récursive de la mise en œuvre de fonctionner correctement dans un multithread
de l'environnement, j'ai implémenté une fonction fib qui utilise à la fois BigInteger
et la Récursivité. Prend environ 53ms pour calculer les 100 premiers fib numéros.
Le code de test est:
Ici est une ligne febonacci récursive:
Juste pour compléter, si vous voulez être en mesure de calculer un plus grand nombre, vous devez utiliser BigInteger.
Un processus itératif exemple.
http://en.wikipedia.org/wiki/Fibonacci_number dans plus de détails
Rendre aussi simple que de besoin pas besoin d'utiliser la boucle while et d'autres boucle de
Utilisation
while
:L'avantage de cette solution est qu'il est facile de lire le code et de le comprendre, en espérant que cela aide à
Un Fibbonacci séquence est celle qui sommes le résultat d'un certain nombre
puis nous avons ajouté au résultat précédent, nous devrions commencé à partir de 1.
J'ai essayé de trouver une solution basée sur un algorithme, donc j'ai construit le code récursif, remarqué que je garde le numéro précédent, et j'ai changé la position. Je suis à la recherche de la Fibbonacci séquence de 1 à 15.
Essayer cette
Pour plus d'info caisseSortie de la suite de Fibonacci en Java - Médiocre Code
Ici est O(1) solution :
Binet nombre de Fibonacci formule utilisé ci-dessus pour la mise en œuvre.
Pour les grandes entrées
long
peut être remplacé parBigDecimal
.La suite de Fibonacci est un code simple qui montre la puissance de la programmation dynamique. Tous nous avons appris de jours d'école est de le lancer via itératif ou max récursive code. Récursive code fonctionne très bien jusqu'à 20 ou alors, si vous donnez des nombres plus grands que ce que vous verrez, cela prend beaucoup de temps à calculer. La programmation dynamique, vous pouvez coder comme suit et il prend secondes pour calculer la réponse.
Vous stocker des valeurs dans un tableau et de procéder à la fraîche de calcul uniquement lorsque le tableau ne peut pas vous fournir la réponse.
Simple De Fibonacci
Oui, il est important de mémoriser votre calculée valeur de retour de chaque récursion appel de méthode, de sorte que vous pouvez afficher la série en appelant la méthode.
Il y a une certaine amélioration dans la mise en œuvre prévue. Veuillez trouver ci-dessous la mise en œuvre, qui nous donne plus correcte et polyvalent de sortie:
De sortie pour le numéro 50 est:
@chro est sur place, mais il ne montre pas la manière correcte de le faire de manière récursive. Voici la solution:
Au lieu d'utiliser un tableau et de faire des choses de fantaisie juste deux ajouter deux valeurs est un gaspillage de temps, j'ai trouvé un moyen efficace pour afficher/imprimer,la célèbre suite de Fibonacci.
Vous pouvez faire comme ceci.