Ruby algorithme de Fibonacci
Voici une méthode que j'ai écrit pour calculer une valeur dans la séquence de Fibonacci:
def fib(n)
if n == 0
return 0
end
if n == 1
return 1
end
if n >= 2
return fib(n-1) + (fib(n-2))
end
end
Il fonctionne uptil n = 14, mais après que je reçois un message disant que le programme est trop long à répondre (je suis en utilisant repl.c'). Quelqu'un sait pourquoi ce qui se passe?
eh bien, avez-vous d'utiliser une fonction récursive? Je pense que votre programme de débordements.
OriginalL'auteur user3769323 | 2014-06-26
Vous devez vous connecter pour publier un commentaire.
Naïf de fibonacci fait beaucoup de répéter les calculs en
fib(14)
fib(4)
est calculé plusieurs fois.Vous pouvez ajouter memoization de votre algorithme pour le rendre beaucoup plus rapide:
Très élégant, beau travail.
de ce qu'on appelle en cache pas, mais au lieu memoization
OriginalL'auteur Uri Agassi
Comme d'autres l'ont souligné, la mise en œuvre de la course du temps, croît de façon exponentielle dans
n
. Il y a beaucoup plus propres implémentations.Constructive [O(n) temps d'exécution O(1) de stockage]:
Memoized la récursivité [O(n) temps d'exécution O(n) de stockage]:
Récursive des puissances d'une matrice de multiplication à l'aide de carrés la réduction de moitié de la puissance pour quand tu dois juste savoir vraiment grand factorielles comme 1_000_000.fib [O(log n) temps d'exécution et de stockage (sur pile)]:
OriginalL'auteur pjs
Votre programme a exponentielle d'exécution en raison de la récursivité vous utilisez.
Développer seulement les appels récursifs quelques niveaux pour vous montrer pourquoi:
La terrible exécution pourrait être à l'origine de votre blocage de programme, comme l'augmentation de
fib(n)
par 1 signifie que vous avez une TONNE plus d'appels récursifsOriginalL'auteur Kevin L
votre programme de débordements que Kevin L'a expliqué.
au lieu de cela, vous pouvez utiliser un algorithme itératif comme ceci:
end
après laif
avant laelse
, etrange
n'est pas valide non plus. Je vais modifier votre code pour le faire fonctionner, revenir en arrière et ajuster si vous êtes en désaccord.eh bien, j'ai juste écrit avec une tête endormie, je vous serais reconnaissant de le modifier.
OriginalL'auteur sertsedat
J'ai essayé de comparer le temps d'exécution des deux méthodes de fibonacci sur repl.il
Sortie
Comme vous pouvez le voir, le moteur d'exécution est tout à fait différent. @Uri Agassi a suggéré, l'utilisation memoization. Le concept est expliqué assez bien ici https://stackoverflow.com/a/1988826/5256509
OriginalL'auteur Hanmaslah