Vous êtes sur la page 1sur 2

Université d’Aix-Marseille - Faculté des Sciences

Licence d'Informatique - Licence de Mathématiques

ENSIN2U1 - Programmation
TP 5
Récursivité

1. Récursivité pas à pas.


Reprise de l’exercice 1 de la feuille TD4 pour examiner la trace d’exécution de fonctions récursives.
1.1. Simple récursivité
Ecrire une fonction récursive appelée recur_U qui prend en paramètre un entier n et calcule la valeur
de un qui est définie par u1 = 1 et un = 3. un-1 + 2 pour n > 1. Ecrivez le programme permettant de
tester cette fonction. Exécutez cette fonction, notamment avec 0 en entrée.
Ensuite, adaptez votre fonction pour que celle-ci affiche au début d’un appel de la fonction un message
de la forme :
[entrée dans recur_U avec n = k]
où k est la valeur du paramètre effectif n, puis juste avant l’exécution du return, le message :
[sortie de recur_U avec n = k]
Attention, votre fonction devra être adaptée de telle sorte que pour tout return, l’expression renvoyée
soit simple (i.e. ne comporte aucun opérateur arithmétique). On ne pourra ainsi pas avoir « return
(3*recur_U(n-1)+2); ». Modifiez votre fonction de telle sorte qu’à l’exécution, une
temporisation soit réalisée juste après chaque affichage.

1.2. Double récursivité

Même exercice que le précédent mais avec la suite v1 = 1, v2 = 2 et vn = 2.vn-1 - vn-2 pour n > 2, et une
fonction récursive appelée recur_V. Toutefois, avant de modifier recur_V avec l’intégration de
l’affichage, vous testerez cette fonction avec les valeur 1, 5, 10, 15, 20, 25, etc… pour observer le
comportement temporel.

2. Calcul du nème nombre de Fibonacci.


Concevez un programme permettant le calcul du nème nombre de Fibonacci noté fn . On rappelle que f0 =
0, f1 = 1, et pour tout n > 1, fn = fn-1 + fn-2. Vous définirez une fonction itérative appelée fib_ite et
une fonction récursive appelée fib_rec. Dans l’écriture de chacune de ces fonctions, vous utiliserez
une variable globale appelée nb_add permettant de calculer le nombre total d’additions réalisées lors
des exécutions (sauf celle de l’incrémentation de nb_add) . En regardant d’une part les valeurs
respectives de nb_add pour les exécutions de fib_ite et de fib_rec, et d’autre part les temps
CPU nécessaires, analysez les temps de calcul de chaque fonction. Quelles progressions suivent les
courbes du temps en fonction de la valeur du nombre à calculer (i.e. en fonction de n) et pourquoi ?

3. Calcul de puissance.
Dans la feuille de TD 4, le problème de calcul de puissances, de type xp a été traité de deux façons
différentes (questions 5.1 et 5.2). Programmez les deux fonction de façon récursive en les adaptant
pour des entiers (pour p) et pour des grands réels (pour x) afin de pouvoir traiter de grands nombres
(pour les résultats). Analysez les temps de calcul pour l'exécution de ces deux fonctions. Quelles
progressions suivent les courbes du temps en fonction de la valeur de p et pourquoi ? Que pouvez-
vous en conclure sur l'efficacité respective des deux fonctions ?

5.1. Ecrire une fonction récursive prenant en entrées deux entiers strictement positifs x et p, et
calculant xp .
5.2. On suppose maintenant que l’entier p est une puissance de 2, c’est-à-dire qu’il existe un
entier k tel que p = 2k. On remarque que xp = xp/2.xp/2. Sur la base de cette remarque, on peut
déduire une nouvelle méthode pour calculer xp . Il suffit de calculer xp/2, puis de calculer son
carré. Par exemple, si x = 5 et p = 8, on a xp = 58 = 54 . 54 = (54 )2 = (52 .52 )2 = ((52 )2 )2 =
((51 .51 )2 )2 = (((51 )2 )2 )2 = (((5)2 )2 )2 = ((25)2 )2 = (625)2 = 390625. On a ainsi uniquement 3
multiplications à réaliser à la place de 8 (ou 7) selon la méthode de base. En exploitant cette
approche, donnez une fonction réalisant le calcul de xp .
4. Affichage de figures avec des astérisques.
4.1. Feuille de TD 5. Dans un premier temps, programmez et testez les procédures demandées dans
l’exercice 1 de la feuille de TD 5 et dont l’énoncé est rappelé ci-dessous :
1.1.  Ecrivez une procédure itérative d’affichage de n astérisques sur une ligne.
Ecrivez-en une version récursive : si n > 0 alors afficher un astérisque et faire un
affichage d’une ligne de n-1 astérisques.
1.2.  En utilisant la procédure d’affichage d’une ligne d’astérisques, écrivez une
procédure itérative d’affichage d’un carré d’astérisques de côté n.
1.3.  Ecrivez maintenant une version récursive en définissant une procédure
d’affichage d’un rectangle de hauteur h et de longueur n : si h > 0, afficher une
ligne de n astérisques puis un rectangle d’astérisques dont la longueur vaut n et de
hauteur h-1.
4.2. Affichage de triangles. En utilisant la procédure d’affichage d’une ligne d’astérisques,
écrivez une procédure récursive d’affichage d’un triangle droit isocèle (plein
d’astérisques) dont la hauteur et la base ont pour longueur n, comme indiqué ci-dessous
(pour n = 4) :
****
***
**
*
Modifiez la procédure pour que l’affichage du triangle se fasse à l’envers, comme indiqué
ci-dessous.
*
**
***
****

4.3. Affichage de triangles (bis). En utilisant la procédure d’affichage d’une ligne


d’astérisques, écrivez une procédure récursive d’affichage “vertical” d’un triangle droit
(plein d’astérisques) dont la hauteur vaut n astérisques et la base 2n-1 comme indiqué ci-
dessous (pour n = 4).
*
**
***
****
***
**
*

5. Visualisation de tracés de fractales.


Reprendre les questions de travaux dirigés qui portaient sur les fractales (feuille TD 5 – exercice 2)
afin de concevoir un programme permettant de visualiser les tracés après saisie de certains arguments
que vous définirez.

Vous aimerez peut-être aussi