tp maple no13 graphisme et récursivité

2
TP MAPLE n o 13 Graphisme et r ´ ecursivit ´ e Benjamin Favetto Vincent Mercat 10 mai 2009 1 Introduction Dans ce TP, on va pr´ esenter quelques probl` emes dont la solution informatique la plus simple repose sur le constat suivant : si l’on connait la valeur de la solution ` a l’´ etape n, il est tr` es facile d’en d´ eduire la solution `a l’´ etape n + 1, ´ etant sous-entendu que le calcul direct de la solution ` a l’´ etape n depuis l’´ etape 0 peut s’av´ erer notoirement plus compliqu´ e (on fera le rapprochement avec le raisonnement par r´ ecurrence, par exemple) . . . 2 Pour comprendre : le calcul de n! L’exemple le plus simple de fonction r´ ecursive ` a programmer est celui de la factorielle. Programmer et comprendre ce que fait la proc´ edure suivante > facto:=proc(n::nonnegint) option remember; if n=0 then return 1; else return n*facto(n-1); end; end proc; > facto(3); > facto(-1); Exercice : ´ ecrire une deuxi` eme proc´ edure calculant la valeur de n!, mais cette fois-ci avec une boucle for. Comparer les temps d’´ ex´ ecution dans les deux cas. Que se passe-t-il si l’on enl` eve l’option remember ? 3 Un peu plus loin : l’exponentiation rapide L’algorithme d’exponentiation rapide permet de calculer la valeur de x n beaucoup plus rapidement qu’en faisant n multiplications successives (concr` etement, il fait de l’ordre de log 2 n multiplications). Il est bas´ e sur la remarque suivante : pour n pair, il suffit de savoir calculer y n 2 avec y = x 2 et pour n impair, il suffit de calculer x.y n-1 2 . Programmer et comprendre ce que fait la proc´ edure suivante : > puissance:=proc(x,n) if n=1 then return x; else if n mod 2 = 0 then return puissance(x*x, n/2); else return x*puissance(x*x,(n-1)/2); end; end; end proc; Observer la diff´ erence de temps d’ex´ ecution avec et sans l’option remember. 1

Upload: lytram

Post on 05-Jan-2017

222 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: TP MAPLE no13 Graphisme et récursivité

TP MAPLE no13

Graphisme et recursivite

Benjamin FavettoVincent Mercat

10 mai 2009

1 Introduction

Dans ce TP, on va presenter quelques problemes dont la solution informatique la plus simple reposesur le constat suivant : si l’on connait la valeur de la solution a l’etape n, il est tres facile d’en deduire lasolution a l’etape n+ 1, etant sous-entendu que le calcul direct de la solution a l’etape n depuis l’etape 0peut s’averer notoirement plus complique (on fera le rapprochement avec le raisonnement par recurrence,par exemple) . . .

2 Pour comprendre : le calcul de n!

L’exemple le plus simple de fonction recursive a programmer est celui de la factorielle. Programmeret comprendre ce que fait la procedure suivante

> facto:=proc(n::nonnegint)option remember;if n=0 thenreturn 1;else return n*facto(n-1);end;end proc;> facto(3);> facto(-1);

Exercice : ecrire une deuxieme procedure calculant la valeur de n!, mais cette fois-ci avec une bouclefor. Comparer les temps d’execution dans les deux cas. Que se passe-t-il si l’on enleve l’option remember ?

3 Un peu plus loin : l’exponentiation rapide

L’algorithme d’exponentiation rapide permet de calculer la valeur de xn beaucoup plus rapidementqu’en faisant n multiplications successives (concretement, il fait de l’ordre de log2 n multiplications). Ilest base sur la remarque suivante : pour n pair, il suffit de savoir calculer y

n2 avec y = x2 et pour n

impair, il suffit de calculer x.yn−1

2 . Programmer et comprendre ce que fait la procedure suivante :

> puissance:=proc(x,n)if n=1 thenreturn x;

elseif n mod 2 = 0 thenreturn puissance(x*x, n/2);

else return x*puissance(x*x,(n-1)/2);end;

end;end proc;

Observer la difference de temps d’execution avec et sans l’option remember.

1

Page 2: TP MAPLE no13 Graphisme et récursivité

4 Arbres fractals

Le but de cette section est d’illustrer graphiquement la puissance des fonctions recursives, en tracantdes arbres fractals. Un arbre fractal est dit fractal lorsque les branches issues du tronc sont elles-memesdes arbres en reductions. Il appartient a la categorie des objets autosimilaires (on dit d’un objet qu’il estautosimilaire ou invariant d’echelle s’il est reproduit par l’agrandissement de l’une de ses parties).

Question 1. Ecrire une procedure simili:=proc(z,r,t,c) qui renvoie l’affixe de l’image du pointd’affixe z par la similitude directe de centre c, de rapport r et d’angle t.

Le procede de construction de l’arbre est le suivant : etant donne un segment initial [A,B], que l’onappelle tronc, on deduit les k (souvent k = 2 . . . 4) branches qui partent de ce tronc par des similitudesdirectes de centre B, de rapport rk et d’angle θk. Ainsi, pour obtenir la n-eme etape de construction d’unarbre fractal, on construit le tronc, puis on lui adjoint k arbres fractals d’ordre construits en n− 1 etapesau sommet du tronc. C’est le principe d’une construction recursive !

Question 2. Ecrire une procedure recursive proc_arbre:=proc(A,B,L,t,n) ou A et B sont les af-fixes de deux points du plan, L est une liste contenant les rapports des differentes similitudes et t lesangles, et n un entier, et qui renvoie une suite de segments (donnes sous la forme [A,B] avec A et B lesaffixes des extremites) composant l’arbre au bout de n iterations du procede de construction.

Question 3. Ecrire une procedure listepoints:=proc(liste) qui prend en argument une liste desegments sous la forme [A,B] et qui renvoie la liste des coordonnees des points correspondants sous laforme [[<(A),=(A)], [<(B),=(B)]].

Question 4. Tracer les figures ci-dessus (l’arbre et la fougere). On observera en particulier l’influencedu choix des valeurs pour l’angle et le rapport des similitudes sur le trace.

Question 5. Comment modifier la procedure proc_arbre pour que les nouvelles branches issues dutronc ne partent pas forcement du sommet ?

2