C1 Recursivité - Activités
Activités
Activité 1 : A la découverte de la récursivité
-
L'escalier
-
Ecrire un programme Python permettant de tracer un escalier tel que ci-dessous en répétant le motif de base (le tracé d'une marche):
-
Pour réaliser le dessin ci-dessus vous avez probablement utilisé une boucle, votre programme est dit itératif. Remarquons à présent que l'escalier à construire était composé de 8 marches. On pourrait écrire qu'un escalier de 8 marches, c'est une marche suivi d'un escalier de 7 marches. Nous venons de donner une définition récursive c'est à dire qu'on a définit un escalier par rapport à lui même. Les fonctions de Python peuvent de la même façon faire appelle à elle-même et donc être récursive. Par exemple :
Intégrer cette fonction dans le programme précédant, écrire la fonctiondef dessine_escalier(nb_marches): dessine_une_marche() dessine_escalier(nb_marche-1)
dessine_une_marche
puis tester. Que se passe-t-il ? -
Intégrer une condition d'arrêt : si
nb_marches
est négatif ou nul, ne rien faire. Tester de nouveau.
-
-
Le dessin de la frise ci-dessous est constitué de la répétition d'un motif de base (en rouge).
- Ecrire une fonction
motif()
qui dessine le motif de base (les dimensions sont indiquées sur l'illustration ci-dessous): - A l'aide d'un programme itératif, construire la frise.
- Donner une définition récursive de la frise
- Ecrire une fonction récursive permettant de construire la frise.
- Ecrire une fonction
-
La spirale
-
Ecrire un programme Python itératif permettant de tracer la spirale de carré suivante sachant que :
- Le côté du grand carré initial mesure 200 pixels
- Le coin inférieur gauche des carrés est l'origine du repère
- A chaque étape les carrés tournent de 20°
- A chaque étape la côté du carré diminue de 10% de sa longueur.
- On interrompt la construction lorsque la taille est inférieure ou égale à 10 pixels
-
On déompose la spirale en un premier carré (en trait épais ci dessous), suivi d'une spirale de carrés (en gris et traits fin ci-dessous) : En déduire une définition récursive de la spirale.
- Proposer une fonction récursive permettant de construire la spirale.
-
Activité 2 : D'autres exemples de récursivité
-
Somme des
n
premiers entiers- Ecrire une fonction python
somme(n)
itérative qui calcule la somme desn
premiers entiers. Par exemplesomme(5)
renvoie15
puisque1+2+3+4+5=15
. - Compléter l'égalité mathématique suivante entre
somme(n)
etsomme(n-1)
:
somme(n) = somme(n-1) + ...
- En déduire une version récursive de la fonction
somme(n)
- Ecrire une fonction python
-
Écrire à l'envers
- Compléter puis tester le code de la fonction Python ci-dessous qui prend en argument une chaine de caractère et la renvoie écrite à l'envers
def envers(chaine): resultat = "" for caractere in .....: resultat = ...... + resultat return .....
-
On décompose une
chaine
enchaine = debut + dernier caractère
, compléter la définition récursive suivante :envers(chaine) = .......... + envers(.......)
-
En déduire une version récursive de la fonction
envers
Aide
On pourra écrire au préalable une fonction
debut(chaine)
qui renvoie la chaine privée de son dernier caractère. On rapelle que le dernier caractère dechaine
s'obtient avecchaine[-1]
.
- Compléter puis tester le code de la fonction Python ci-dessous qui prend en argument une chaine de caractère et la renvoie écrite à l'envers
Activité 3 : Soulever le capot de la récursivité
- Se rendre sur le site Python tutor, un outil en ligne permettant de visualiser le fonctionnement d'un programme Python. Laisser les options par défaut à l'exception de
inline primitives don't nest objects [default]
) à remplacer parrender all objects on the heap (Python/Java)
comme ci-dessous : -
Entrer sur Python tutor le code de fonction
somme(n)
itérative, qu'on teste avecn=5
:Suivre l'exécution pas à pas du calcul.def somme(n): s = 0 for i in range(n): s+=i return s test = somme(5)
-
Faire de même mais avec la fonction
somme_recursive(n)
:def somme_recursive(n): if n==0: return 0 else: return n + somme_recursive(n-1) test = somme_recursive(5)
- La figure suivante représente une étape de l'exécution. Comment expliquer que les entiers sont "stockés" à droite mais qu'aucun calcul n'a encore été effectué ?
- La colonne de droite où sont stockés les entiers s'appelle une pile, (heap en anglais). La taille maximale de cette pile est la profondeur maximale de récursion (recursion depth). Quitter Python Tutor et tester la fonction
somme_recursive
avec une valeur élevée den
(par exemplen=3000
). Que se passe-t-il ? Expliquer. - La version itérative est-elle concernée par ce problème ?