Introduction à la récursivité
Flocon de Koch
from turtle import forward,left,right,exitonclick
def flocon(n, taille):
if n==0:
forward(taille)
else:
forward(taille/3)
left(60)
forward(taille/3)
right(120)
forward(taille/3)
left(60)
forward(taille/3)
exitonclick()
-
Copiez ce code dans VSCodium, et juste avant le
exitonclick()
qui permet de laisser le dessin ouvert jusqu'à ce qu'on clique dessus :- Testez ce que fait la fonction flocon avec n=0 et taille=200
- Testez avec n=1
Récursivité
Une fonction récursive est une fonction qui contient dans son code un appel à elle-même.
C'est tout à fait autorisé en python.
-
Changez dans la fonction flocon chacune des lignes
forward(taille/3)
en un appel récursif à la fonction flocon qui fasse la même chose si on l'appelle avec n=1. Testez pour vérifier. -
Vérifiez qu'avec ces appels récursifs la fonction flocon avec n=2 appelle la fonction flocon avec n=1, qui elle-même appelera la fonction flocon avec n=0. Testez avec n=2, puis n=3.
-
Importez la fonction
speed
du module turtle et appelezspeed(10)
au début du programme pour dessiner plus vite. -
Appelez trois fois la fonction flocon en tournant de 120° entre chaque appel pour dessiner en entier le Flocon de Koch. Plus on augmente la valeur de n, plus on se rapproche de cette courbe fractale.
"Boucle" infinie sans while
- Créez une fonction toute simple qui affiche un message avec print.
- Ajoutez un appel récursif pour que des messages s'affichent sans s'arrêter, sans utiliser de boucle.
Warning
Avec des appels récursifs, on peut créer un programme qui ne se termine pas comme avec une boucle while.
- Est-ce que le programme tourne vraiment sans s'arrêter ? Que se passe-t-il en python ?
"Boucle" qui se répète n fois
Modifiez votre programme précédent en ajoutant un paramètre qui précise combien de fois la fonction doit s'appeler elle-même.
Par exemple si on l'appelle avec 5
comme argument, on doit avoir 5 messages affichés puis le programme s'arrête.
Info
Ceci est la manière dont certains langages de programmation dits "fonctionnels" font pour répéter des instructions sans utiliser de boucles for ou while.
Warning
Vous avez dû mettre un test pour que les appels récursifs s'arrêtent (par exemple quand le paramètre vaut 0).
On appelle ces situations où il ne faut plus faire d'appels récursifs les cas de bases et il faut toujours qu'il y en ait quand on écrit des fonctions récursives, sinon on est sûrs d'avoir des appels infinis.
Calculer une suite récursive
En maths vous avez probablement vu des suites définis comme ceci :
\(u_0 = 3\)
\(u_{n+1} = 2*u_n - 10\)
On peut coder une fonction u
qui prend comme paramètre n et renvoie \(u_n\) en utilisant une liste et une boucle for et en rajoutant les valeurs de u une par une à la fin de la liste jusqu'à atteindre \(u_n\).
Mais en fait, le code python sera plus simple et très proche de la définition si on utilise la récursivité. Il suffit de coder la fonction u
en disant que :
- soit n vaut 0 et on renvoie 3
- sinon, on renvoie
2*u(n-1) - 10
Exercice : Écrivez la version récursive. Puis, écrivez la version sans récursivité avec la liste et la boucle for, pour comparer.