Rapide de Fibonacci de la récursivité
Je suis en train d'essayer de se souvenir d'un algorithme de Fibonacci de la récursivité. Suivantes:
public int fibonacci(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
est pas ce que je cherche parce que c'est gourmand. Cela va croître de façon exponentielle (il suffit de regarder Java récursif de la suite de Fibonacci - le plus gros de l'argument initial les plus inutiles, les appels seront effectués).
Il y a probablement quelque chose comme un "cyclique argument shift", où l'appel précédent de Fibonacci de la valeur de récupérer la valeur au lieu de calculer à nouveau.
Vous devez vous connecter pour publier un commentaire.
peut-être comme ceci:
cette fonction est la queue récursive. cela signifie qu'il pourrait être optimisée et exécuté de façon très efficace. En fait, il obtient optimisé dans une simple boucle..
if
s sont redondantes. Vous devez avoir soit une.Ce genre de problèmes sont récurrence linéaire types et ils sont résolus, plus rapide via rapide des exponentielles de matrices. Voici la article sur le blog qui décrit ce type d'approche concise.
Vous pouvez faire un peu plus vite que la version récursive de Fibonacci en utilisant memoization (ce qui signifie: stocker les résultats précédents afin d'éviter de recalculer eux). par exemple, voici une preuve de concept en Python, où un dictionnaire est utilisé pour l'enregistrement des résultats précédents:
Elle se retourne rapidement pour les valeurs d'entrée qui serait normalement bloquer la "normale", une version récursive. Il suffit de garder à l'esprit qu'une
int
type de données ne sera pas suffisant pour la tenue de grands résultats, et à l'aide de précision arbitraire des entiers est recommandé.Une autre option tout - à réécrire cette version itérative ...
... comme une queue-fonction récursive, appelé
loop
dans mon code:J'ai trouvé un article très intéressant sur fibonacci problème
ici l'extrait de code
Dites que vous voulez avoir le n-ième fib numéro, puis de construire un tableau contenant les précédents numéros de
Un exemple en JavaScript qui utilise la récursivité et un initialisées cache pour une efficacité supplémentaire:
duedl0r de l'algorithme traduit à Swift:
travaillé exemple:
Vous avez besoin de mémoriser la valeur calculée afin d'arrêter la croissance exponentielle.
Voici un exemple de travail pour accélérer la récursivité à l'aide de la mémoire.
Le calcul des nombres de fibonacci
Un bon algorithme rapide de fibonacci calculs (en python):
Si vous avez besoin de calcul très rapide, des liens vers la libgmp et l'utilisation mpz_fib_ui() ou mpz_fib2_ui fonctions ().