Récursivité
1 Factorielle
Un programme non récursif ? Un programme récursif ? Le principe :
Pour calculer 20!, vous demandez à un assistant de calculer19!, et vous multipliez par 20; l'assistant, lui...
Question
Que se passe-t-il sin <0 ? Démonstration
Comment démontrer que le programme récursif fournit la bonne réponse ? Par récurrence sur n.
2 Ecriture en base 2
Ecrire une fonction qui prend en entrée un entier natureln et calcule une chaîne de caractères qui représentenen base 2.
def baseDeux(n):
if n > 1:
return baseDeux(n // 2) + str(n % 2) else:
return str(n)
3 La suite de Fibonacci
Dénition
F0= 0, F1= 1, et
∀n≥0, Fn+2=Fn+1+Fn
Ecrire 3 fonctions Python qui calculentFn : - Une fonction récursive.
- Une fonction non récursive ecace.
- Une fonction récursive ecace.
Remarque
Avec la première, problèmes à partir den=30 à 35... Donc à proscrire absolument.
Encore mieux
SoitM =
0 1
1 1
. On vérie facilement que pour tout entier natureln: Fn+1
Fn+2
=M.
Fn
Fn+1
Mn =
Fn−1 Fn
Fn Fn+1
Ensuite ?
4 Exponentiation rapide
1
def factorielle(n):
aux = 1
for k in range(2, n + 1):
aux *= k return aux def facto_rec(n):
if n == 0:
return(1)
return n*facto_rec(n-1)
def fib_rec(n):
if n <= 1:
return n else:
return fib_rec(n-1) + fib_rec(n-2) def fibonacci(n):
if n <= 1:
return n a, b = 0, 1
for k in range(2, n+1):
a, b = b, a + b return b
def fib_rec_efficace(a, b, n):
if n == 0:
return a if n == 1:
return b
return fib_rec_efficace(b, a+b, n-1) def fib_rec_efficace_bis(n):
if n == 0:
return 0 if n == 1:
return 0, 1
u, v = fib_rec_efficace_bis(n - 1) return v, u + v
1
def expo_rapide_recursif(a,n):
if n == 1:
return a if n%2 == 0:
return expo_rapide_recursif(a**2, n//2) else:
return a*expo_rapide_recursif(a**2, n//2)
def expo_rapide(a,n):
resultat = 1 while n > 0:
if n % 2 == 1:
resultat *= a n = n//2
a = a**2 return resultat
# Invariant de boucle :
# resultat*a**n est constant
1
5 Un programme inutile
Expliquez ce que fait ce programme.
from random import randint def essai(n):
loc = randint(1,100)
print('n : ', n, ', loc : ', loc) if n > 1:
essai(n-1) essai(n-2)
print('n : ', n, ', loc : ', loc) Les variables globales
Extrait du programme ociel :
On décourage l'utilisation des variables globales autant que possible.
from random import randint def essai(n):
global a
a = randint(1,100)
print('n : ', n, ', a : ', a) if n > 1:
essai(n-1) essai(n-2)
print('n : ', n, ', a : ', a)
4