====== Suite de Fibonacci : encore un algorithme ======
Voici le programme complété pour la technique récursive :
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
Calculs des premiers éléments de la suite de Fibonacci.
Référence : http://fr.wikipedia.org/wiki/Suite_de_Fibonacci
Application de la définition par récursivité.
"""
def fibonacci_item_recursive(n):
"""
Renvoie l'élément d'indice n de la suite de Fibonacci
"""
if n == 0:
return 0
elif n == 1:
return 1
return fibonacci_item_recursive(n-1)+fibonacci_item_recursive(n-2)
if __name__ == '__main__':
i = input("Suite de Fibonacci. Donnez l'indice de l'élément souhaité ? ")
print("Élément de la suite : "),
printfibonacci_item_recursive(i)
print('Premiers éléments de la suite : ')
for j in range(10):
print(j,fibonacci_item_recursive(j))
La page Wikipedia sur la suite de Fibonacci introduit aussi un [[wp>fr:Suite_de_Fibonacci#Algorithme_logarithmique|algorithme logarithmique]]. Même s'il est très intéressant à décortiquer, on peut se contenter de simplement l'appliquer :
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
Calculs des premiers éléments de la suite de Fibonacci.
Référence : http://fr.wikipedia.org/wiki/Suite_de_Fibonacci
Application de l'algorithme logarithmique
http://fr.wikipedia.org/wiki/Suite_de_Fibonacci#Algorithme_logarithmique
"""
def fibo2(n):
"""Renvoie F_{n-1}, F_n"""
if n == 0: # cas de base
return 1, 0 # F_{-1}, F_0
else: # récurrence
f_k_1, f_k = fibo2(n//2) # F_{k-1}, F_k avec k = n/2
f2_k = f_k**2 # F_k^2
if n%2 == 0: # n pair
return f2_k + f_k_1**2, f_k*f_k_1*2 + f2_k # F_{2k-1}, F_{2k}
else: # n impair
return f_k*f_k_1*2 + f2_k, (f_k + f_k_1)**2 + f2_k # F_{2k}, F_{2k+1}
def fibonacci_item_logarithmic(n):
"""Renvoie F_n"""
return fibo2(n)[1]
if __name__ == '__main__':
i = input("Suite de Fibonacci. Donnez l'indice de l'élément souhaité ? ")
print("Élément de la suite : "),
printfibonacci_item_logarithmic(i)
print('Premiers éléments de la suite : ')
for j in range(10):
print(j,fibonacci_item_logarithmic(j))
Sur la même page wikipedia, on trouve une [[wp>fr:Suite_de_Fibonacci#Expression_fonctionnelle|expression fonctionnelle]], de complexité apparente en temps constant, aussi connue sous le nom de [[wp>fr:Suite_de_Fibonacci#Avec_la_formule_de_Binet|formule de Binet]], mais qui passe par le calcul du nombre irrationnel $\sqrt{5}$, ce qui pose un problème pour conserver une précision des chiffres significatifs par rapport à l'arithmétique entière.
Le langage Python permet également de mettre en œuvre des générateurs (generator) : //cf.// [[http://www.koderdojo.com/blog/python-fibonacci-number-generator]] et [[http://www.bogotobogo.com/python/python_generators.php]]
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
Calculs des premiers éléments de la suite de Fibonacci.
Référence : http://fr.wikipedia.org/wiki/Suite_de_Fibonacci
"""
def fibonacci_gen(n):
"""
Renvoie l'élément d'indice n de la suite de Fibonacci
"""
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
if __name__ == '__main__':
i = int(input("Suite de Fibonacci. Donnez l'indice max des éléments souhaités ? "))
print("Le générateur : "),
print(fibonacci_gen(i))
print('Éléments de la suite : ')
for j in fibonacci_gen(i):
print(j)
Nous disposons à présent de plusieurs méthodes/fonctions pour calculer les éléments de la suite de Fibonacci.
Pour rechercher quel est le meilleur algorithme, [[suite_de_fibonacci-5|cliquez ici !]]