12.4 Autres applications mathématiques de la récursivité
Objectifs d'apprentissage
À la fin de cette section, vous devriez être capable de :
- Définir une fonction récursive pour générer les nombres de Fibonacci.
Suite de Fibonacci à l'aide de la récursivité
La suite de Fibonacci est une suite dans laquelle chaque nombre est la somme des deux nombres précédents de la suite. Les deux premiers nombres sont 0 et 1. Ainsi, en partant de 0 et 1, le troisième nombre est 0 + 1 = 1, et le nombre suivant est 1 + 1 = 2. La suite de nombres est 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... .
La récursivité peut être utilisée pour calculer le n-ième nombre de Fibonacci. Les cas de base sont 0 et 1. Par la suite, le n-ième nombre s'obtient en additionnant le (n - 1)-ième et le (n - 2)-ième nombre. Ainsi, fib(n) = fib(n - 1) + fib(n - 2), ce qui constitue une définition récursive se terminant par les cas de base f(0) = 0 et f(1) = 1.
Pour une récursivité qui effectue plusieurs appels de fonction dans le cas récursif, il est utile de suivre le déroulement de la récursivité. Une structure utilisée pour suivre les appels effectués par une fonction récursive est appelée un arbre de récursivité (recursion tree). L'animation ci-dessous retrace l'arbre de récursivité pour un appel à une fonction récursive calculant le nombre de Fibonacci pour n = 5.
Exemple 12.1
Trouver le n-ième nombre de Fibonacci
La récursivité de la fonction de Fibonacci est plus complexe, la valeur en n dépendant de deux appels de fonction avec des valeurs plus petites.
""" Recursive Fibonacci function """
def fib(n):
# Base case
if n == 0 or n == 1:
return n
# Recursive case
elif n > 1:
return fib(n - 1) + fib(n - 2)
# Error case
else:
print("Fibonacci numbers begin at 0.")
return
# Test code
print(fib(7))
La sortie du code ci-dessus est :
13
Concepts en pratique
Nombres de Fibonacci
Plus grand commun diviseur (PGCD)
Le plus grand commun diviseur (GCD) de deux entiers positifs est un entier qui est un diviseur des deux entiers. Ex. : Le PGCD de 6 et 9 est 3 car 3 x 2 = 6 et 3 x 3 = 9.
Le PGCD se trouve facilement à l'aide de la méthode d'Euclide. La méthode d'Euclide soustrait récursivement le plus petit entier du plus grand entier jusqu'à atteindre un cas de base où les entiers sont égaux. Le plus grand commun diviseur est la valeur entière obtenue lorsque le cas de base est atteint.
Exemple 12.2
Trouver le PGCD
""" Find GCD using recursive implementation of Euclid's method """
def gcd(a, b):
if a == b: # Base case
return a
elif a < b: # Recursive case
return gcd(a, b - a)
else:
return gcd(a - b, a)
# Test code
print(gcd(24, 30))
La sortie du code ci-dessus est :
6
Concepts en pratique
PGCD
À vous d'essayer
Puissance récursive
Écrivez une fonction récursive power() telle que, pour un entier x et un entier positif y donnés, power(x, y) renvoie x élevé à la puissance y.
Ex. : power(3, 4) renvoie 81.
À vous d'essayer
Puissance récursive (avec tout exposant entier)
Écrivez une fonction récursive rec_pow() telle que, pour deux entiers x et y donnés, elle renvoie x élevé à la puissance y.
(Remarque : il s'agit d'une extension du problème ci-dessus, mais qui fonctionne désormais pour toute valeur entière de y, positive ou négative. Comment la fonction récursive devrait-elle être modifiée pour gérer une valeur négative de y ?)
Ex. : rec_pow(2, -4) renvoie 0.0625.