Easier to read with cream paper, a tint, more contrast or larger text? Choose your colours and text, once, for every page.

Aperçu

Quand la récursivité casse

Voici la première page de la leçon. Lis-la et essaie les activités. La suite est dans le cours complet.

30 minutes

Le miroir dans le miroir

Mets deux miroirs face à face. Tu vois ton image dans l’image, encore et encore, sans fin.

Une fonction récursive mal écrite fait la même chose : elle s’appelle sans jamais s’arrêter. Heureusement, Python finit par dire stop. Apprenons à lire ce stop et à réparer.

Mots-clés

MotCe que ça veut direExemple
Cas de baseLe cas simple qui arrête les appels.if n == 0:
Récursion infinieDes appels qui ne s’arrêtent jamais, car le cas de base n’arrive pas.f(n + 1)
ProfondeurLe nombre d’appels empilés en même temps.500 appels
RecursionErrorL’erreur de Python quand la pile est trop haute.maximum recursion depth exceeded

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Trois défauts classiques

Premier défaut : pas de cas de base. Les appels ne s’arrêtent jamais.

Deuxième défaut : l’appel ne rapproche pas du cas de base. Par exemple f(n + 1) quand on veut arriver à 0.

Troisième défaut : l’appel garde le même problème, comme f(mot) au lieu de f(mot[1:]).

À toi : jusqu’où peut-on descendre ?

Code: python
def descendre(n):
    if n == 0:
        return 0
    return 1 + descendre(n - 1)


print(descendre(10))
print(descendre(500))

# Change 500 en 5000 et relance.
# Lis le message d'erreur : Python s'arrête de lui-même.
# Il refuse d'empiler plus d'environ mille appels.

Quel est le défaut ?

À toi de jouer

Quel est le défaut ?

3 questions
Essayez : vos réponses sont notées ici puis oubliées. Connectez-vous si vous voulez conserver votre score et reprendre là où vous en étiez.Se connecter pour conserver mon score

Tes réponses sont corrigées ici et ne sont pas conservées. Un compte garde tes résultats.

Exemple travaillé : une pile qui monte

AppelValeur de nCas de base atteint ?
f(3)3non, on rappelle f(4)
f(4)4non, on rappelle f(5)
f(5)5non, on rappelle f(6)
f(6)6non, et ainsi de suite jusqu’à l’erreur

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Le calcul refait dix fois

Autre piège : une fonction peut être correcte, et pourtant très lente.

Prends la suite de Fibonacci : chaque nombre est la somme des deux précédents. 0, 1, 1, 2, 3, 5, 8, 13.

Écrite en récursif, la fonction refait les mêmes calculs encore et encore.

À toi : compter les appels

Code: python
compteur = 0


def fibo(n):
    global compteur
    compteur = compteur + 1
    if n < 2:
        return n
    return fibo(n - 1) + fibo(n - 2)


for n in [2, 3, 4, 5, 10, 20]:
    compteur = 0
    resultat = fibo(n)
    print("fibo(", n, ") =", resultat, "avec", compteur, "appels")

# Les appels grandissent beaucoup plus vite que n.

Exemple travaillé : le nombre d’appels de fibo

nfibo(n)Nombre d’appels
213
325
439
5515
1055177
20676521891

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

La leçon continue

6 parties de plus de cette leçon se trouvent dans le cours complet, avec les exercices et la vérification finale. Un compte te donne tout.