Veuillez expliquer ce code simple:
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 confus avec la dernière ligne surtout parce que si n = 5 par exemple, alors fibonacci (4) + fibonacci (3) serait appelé et ainsi de suite mais je ne comprends pas comment cet algorithme calcule la valeur à l'index 5 par ceci méthode. Veuillez expliquer avec beaucoup de détails!
Réponses:
Dans la séquence fibonacci, chaque élément est la somme des deux précédents. Donc, vous avez écrit un algorithme récursif.
Alors,
Maintenant tu le sais déjà
fibonacci(1)==1 and fibonacci(0) == 0
. Ainsi, vous pouvez ensuite calculer les autres valeurs.Maintenant,
Et à partir de la séquence fibonacci,
0,1,1,2,3,5,8,13,21....
nous pouvons voir que pour5th element
la séquence fibonacci revient5
.Voir ici pour le didacticiel de récursivité .
la source
Il y a 2 problèmes avec votre code:
Le code
fibonacci(n - 1) + fibonacci(n - 2)
est très faux.
Le problème est qu'il appelle fibonacci non pas 50 fois mais bien plus.
Au début, il appelle fibonacci (49) + fibonacci (48),
ensuite fibonacci (48) + fibonacci (47) et fibonacci (47) + fibonacci (46)
Chaque fois qu'il est devenu fibonacci (n) pire, la complexité est exponentielle.
L'approche du code non récursif:
la source
2*fibonacci(n+1)-1
, donc il croît avec la même complexité que les nombres de fibonacci lui-même, qui est 1,618 ^ n au lieu de 2 ^ nDans le pseudo code, où n = 5, ce qui suit se produit:
Cela se décompose en:
Cela se décompose en:
Cela se décompose en:
Cela se décompose en:
Il en résulte: 5
Étant donné que la séquence de fibonnacci est 1 1 2 3 5 8 ... , le 5e élément est 5. Vous pouvez utiliser la même méthodologie pour déterminer les autres itérations.
la source
La récursivité peut parfois être difficile à saisir. Il suffit de l'évaluer sur une feuille de papier pour un petit nombre:
Je ne sais pas comment Java évalue réellement cela, mais le résultat sera le même.
la source
Vous pouvez également simplifier votre fonction, comme suit:
la source
Le point important à noter est que cet algorithme est exponentiel car il ne stocke pas le résultat des nombres calculés précédents. par exemple F (n-3) est appelé 3 fois.
Pour plus de détails, reportez-vous à l'algorithme de dasgupta chapitre 0.2
la source
La plupart des réponses sont bonnes et expliquent comment fonctionne la récursion dans fibonacci.
Voici une analyse des trois techniques qui comprend également la récursivité:
Voici mon code pour tester les trois:
Voici les résultats:
Par conséquent, nous pouvons voir que la mémorisation est le meilleur moment et que les boucles correspondent étroitement.
Mais la récursion prend le plus de temps et vous devriez peut-être éviter dans la vraie vie. De même, si vous utilisez la récursivité, assurez-vous d'optimiser la solution.
la source
C'est la meilleure vidéo que j'ai trouvée qui explique pleinement la récursivité et la séquence de Fibonacci en Java.
http://www.youtube.com/watch?v=dsmBRUCzS7k
C'est son code pour la séquence et son explication est meilleure que je ne pourrais jamais essayer de la taper.
la source
Pour la solution récursive de fibonacci, il est important de sauvegarder la sortie des petits nombres de fibonacci, tout en récupérant la valeur du plus grand nombre. C'est ce qu'on appelle la "mémorisation".
Voici un code qui utilise la mémorisation des plus petites valeurs de fibonacci, tout en récupérant un plus grand nombre de fibonacci. Ce code est efficace et ne fait pas plusieurs requêtes de la même fonction.
la source
dans la séquence fibonacci , les deux premiers éléments sont 0 et 1, chaque autre élément est la somme des deux éléments précédents. soit:
0 1 1 2 3 5 8 ...
donc le 5ème élément est la somme des 4ème et 3ème éléments.
la source
Michael Goodrich et al fournissent un algorithme vraiment intelligent dans les structures de données et les algorithmes en Java, pour résoudre fibonacci récursivement en temps linéaire en retournant un tableau de [fib (n), fib (n-1)].
Cela donne fib (n) = fibGood (n) [0].
la source
Voici la solution O (1):
Formule du nombre de Fibonacci de Binet utilisée pour l'implémentation ci-dessus. Pour les grandes entrées
long
peut être remplacé parBigDecimal
.la source
Une séquence de Fibbonacci est celle qui additionne le résultat d'un nombre lorsqu'elle est ajoutée au résultat précédent en commençant par 1.
Une fois que nous comprenons ce qu'est Fibbonacci, nous pouvons commencer à décomposer le code.
La première instruction if vérifie un cas de base, où la boucle peut éclater. L'instruction else if ci-dessous fait la même chose, mais elle pourrait être réécrite comme ça ...
Maintenant qu'un cas de base est établi, nous devons comprendre la pile d'appels. Votre premier appel à "fibonacci" sera le dernier à résoudre sur la pile (séquence d'appels) car ils résolvent dans l'ordre inverse à partir duquel ils ont été appelés. La dernière méthode appelée résout en premier, puis la dernière à être appelée avant celle-là et ainsi de suite ...
Ainsi, tous les appels sont effectués en premier avant que quoi que ce soit ne soit "calculé" avec ces résultats. Avec une entrée de 8, nous attendons une sortie de 21 (voir tableau ci-dessus).
fibonacci (n - 1) continue d'être appelé jusqu'à ce qu'il atteigne le cas de base, puis fibonacci (n - 2) est appelé jusqu'à ce qu'il atteigne le cas de base. Lorsque la pile commence à additionner le résultat dans l'ordre inverse, le résultat sera comme ceci ...
Ils continuent à bouillonner (se résolvent à l'envers) jusqu'à ce que la somme correcte soit retournée au premier appel de la pile et c'est ainsi que vous obtenez votre réponse.
Cela dit, cet algorithme est très inefficace car il calcule le même résultat pour chaque branche dans laquelle le code se divise. Une bien meilleure approche est une approche «ascendante» où aucune mémorisation (mise en cache) ou récursivité (pile d'appels en profondeur) n'est requise.
Ainsi...
la source
La plupart des solutions proposées ici fonctionnent en complexité O (2 ^ n). Recalculer des nœuds identiques dans une arborescence récursive est inefficace et gaspille des cycles CPU.
Nous pouvons utiliser la mémorisation pour exécuter la fonction fibonacci en temps O (n)
Si nous suivons la route de programmation dynamique ascendante, le code ci-dessous est assez simple pour calculer fibonacci:
la source
Pourquoi cette réponse est différente
Toute autre réponse soit:
(à part: aucun de ceux-ci n'est réellement efficace; utilisez la formule de Binet pour calculer directement le n ème terme)
Fib récursif de queue
Voici une approche récursive qui évite un double appel récursif en passant à la fois la réponse précédente ET celle qui précède.
la source
C'est une séquence de base qui affiche ou obtient une sortie de 1 1 2 3 5 8 c'est une séquence que la somme du nombre précédent le nombre actuel sera affiché ensuite.
Essayez de regarder le lien ci-dessous Tutoriel de séquence de Fibonacci récursif Java
Cliquez ici Regardez le didacticiel de séquence de Fibonacci récursif Java pour l'alimentation à la cuillère
la source
Je pense que c'est un moyen simple:
la source
La réponse RanRag (acceptée) fonctionnera bien, mais ce n'est pas une solution optimisée jusqu'à ce qu'elle soit mémorisée comme expliqué dans la réponse Anil.
Pour l'approche récursive envisagée ci-dessous, les appels de méthode
TestFibonacci
sont minimauxla source
la source
En utilisant un ConcurrentHashMap interne qui pourrait théoriquement permettre à cette implémentation récursive de fonctionner correctement dans un environnement multithread, j'ai implémenté une fonction fib qui utilise à la fois BigInteger et Recursion. Prend environ 53 ms pour calculer les 100 premiers nombres de fib.
Le code de test est:
la source
Voici un febonacci récursif d'une ligne:
la source
Essaye ça
la source
Pour compléter, si vous voulez pouvoir calculer des nombres plus grands, vous devez utiliser BigInteger.
Un exemple itératif.
la source
http://en.wikipedia.org/wiki/Fibonacci_number en plus de détails
Rendez-le aussi simple que nécessaire, pas besoin d'utiliser une boucle while et une autre boucle
la source
la source
Utilisez
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
la source
Une séquence de Fibbonacci est celle qui additionne le résultat d'un nombre puis nous avons ajouté au résultat précédent, nous devrions commencer à partir de 1. J'essayais de trouver une solution basée sur un algorithme, donc je construis le code récursif, j'ai remarqué que je garde le numéro précédent et j'ai changé la position. Je recherche la séquence de Fibbonacci de 1 à 15.
la source
la source
Fibonacci simple
la source
@chro est parfait, mais il / elle ne montre pas la bonne façon de le faire de manière récursive. Voici la solution:
la source