Previous Up Next
Retour à la page personnelle de Bernard Parisse.

Chapitre 7  Un exemple traité avec un programme iteratif puis récursif

7.1  La suite des triangles semblables à ABC

7.1.1  Avec un programme iteratif

À partir d’un triangle ABC direct on trace le triangle ACC1 semblable au triangle ABC. Puis, on recommence le même processus avec le triangle ACC1 on obtient le triangle AC1C2 etc... Écrire un programme xcas qui déssine la suite des n triangles :
ACC1, AC1C2,...AC(n-1)Cn On dessine tout d’abord le triangle ABC, puis on utilise une boucle qui calcule à chaque étape le nouveau point B (l’ancien point C et le nouveau point C (celui obtenu dans la similitude de centre A de rapport k:=longueur(A,C)/longueur(A,B) et d’angle t:=angle(A,B,C).
Attention
On suppose que le triangle ABC est direct car t:=angle(A,B,C) renvoie la valeur absolue de de la mesure de l’angle oriené (→AB,→AC).
On tape :

//a partir d'un triangle ABC direct on trace son semblable 
//sur AC etc...
//k=rapport et t=angle de la similitude
//n=nombre de triangles a construire
spirale(A,B,C,n):={
local k,t;
triangle(A,B,C);
k:=longueur(A,C)/longueur(A,B);
t:=angle(A,B,C);
for (j:=1;j<=n;j++){
 B:=C; 
 C:=similitude(A,k,t,B);
 triangle(A,B,C);
}
};

On clique sur 3 points ABC (triangle ABC direct) puis on tape :
spirale(A,B,C,5)
On obtient la suite de 6 triangles dans l’écran de géométrie DispG On peut écrire un programme légèrement diffèrent pour ne pas faire deux fois le même trait.
On trace le triangle ABC puis on ne trace dans la boucle que les 2 segments qui vont définir le nouveau triangle :

//meme dessin que spirale(A,B,C,n) 
//mais sans repasser sur le meme trait
spirales(A,B,C,n):={
local k,t;
triangle(A,B,C);
k:=longueur(A,C)/longueur(A,B);
t:=angle(A,B,C);
for (j:=1;j<=n;j++){
 B:=C; 
 C:=similitude(A,k,t,B);
 segment(B,C);
 segment(A,C);
}
};

7.1.2  Avec un programme récursif

On peut voir la récusivité de 2 façons :
1/ la procédure récursive spiraler(A,B,C,n)
spiraler(A,B,C,0) est le triangle(A,B,C) et
si n>0, spiraler(A,B,C,n) est formé du triangle(A,B,C) et de
spiraler(A,C,C1,n-1) avec C1=similitude(A,k,t,C).
On écrit donc :

//Le dessin obtenu a partir d'un triangle ABC direct peut 
//etre decrit de facon recursive si on a C=similitude(A,k,t,B), 
//soit  C1=similitude(A,k,t,C) :
//spiraler(A,B,C,0)=triangle(A,B,C) 
// si n>0, spiraler(A,B,C,n)=triangle(A,B,C) puis 
//spiraler(A,C,C1,n-1)
//n=nombre de triangles a construire=nombre d'appels recursifs
spiraler(A,B,C,n):={
local k,t;
k:=longueur(A,C)/longueur(A,B);
t:=angle(A,B,C);
if (n>0) {
 triangle(A,B,C);
 B:=C;
 C:=similitude(A,k,t,B);
 spiraler(A,B,C,n-1);
   } else
 triangle(A,B,C);
};

On peut écrire un programme légèrement diffèrent pour ne pas faire deux fois le même trait.
spiralers(A,B,C,0) c’est le triangle(A,B,C) si n>0, spiralers(A,B,C,n) est formé du segment(A,B), du segment(B,C) et de spiralers(A,C,C1,n-1) si C1=similitude(A,k,t,C).
On écrit donc :

//meme dessin que spiraler(A,B,C,n) 
//mais sans repasser sur le meme trait
//si on a C=similitude(A,k,t,B), soit  C1=similitude(A,k,t,C) 
//spiralers(A,B,C,0)=triangle(A,B,C) et si n>0, 
//spiralers(A,B,C,n)=segment AB et BC puis spiralers(A,C,C1,n-1)
spiralers(A,B,C,n):={
local k,t;
k:=longueur(A,C)/longueur(A,B);
t:=angle(A,B,C);
if (n>0) {
 segment(A,B);
 segment(B,C);
 B:=C;
 C:=similitude(A,k,t,B);
 spiralers(A,B,C,n-1);
   } else
 triangle(A,B,C);
};

2/ la procédure récursive spiraler1s(A,B,C,n)
spiraler1s(A,B,C,0) c’est le triangle(A,B,C) si n>0, spiraler1s(A,B,C,n) est formé du triangle(A,C(n-1),Cn) (ou des segments C(n-1)Cn et ACn si on ne veut pas repasser sur le même trait) et de spiraler(A,B,C,n-1) si C(n-1)=similitude(A,k^n,n*t,B) et Cn=similitude(A,k^n,n*t,C)=similitude(A,k,t,C(n-1)).

//meme dessin que spiraler(A,B,C,n) mais autre facon de voir 
//la recursivite spiraler1(A,B,C,0)=triangle(A,B,C) si n>0,
//spiraler1(A,B,C,n)=dernier triangle AMN et spiraler1(A,B,C,n-1)
//sans repasser sur le meme trait :
//spiraler1s(A,B,C,0)=triangle(A,B,C) et si n>0, 
//spiraler1s(A,B,C,n)=segments AN et MN et spiraler1s(A,B,C,n-1)
spiraler1s(A,B,C,n):={
local k,t;
k:=longueur(A,C)/longueur(A,B);
t:=angle(A,B,C);
if (n>0) {
 M:=similitude(A,k^n,n*t,B);
 N:=similitude(A,k,t,M);
 segment(M,N);
 segment(A,N);
 spiraler1s(A,B,C,n-1);
   } else 
 triangle(A,B,C);
};

7.2  La double suite des triangles semblables à ABC

À partir d’un triangle ABC direct on trace le triangle ACC1 semblable au triangle ABC. Puis, on recommence le même processus avec le triangle ACC1 on obtient le triangle AC1C2 etc... On trace aussi le triangle ABB1 semblable au triangle ABC. Puis, on recommence le même processus avec le triangle ABB1 on obtient le triangle AB1B2 etc..
Écrire un programme xcas qui déssine la suite des n triangles :
ACC1, AC1C2,...AC(n-1)Cn,ABB1, AB1B2,...AB(n-1)Bn

7.2.1  Avec un programme iteratif

//a partir d'un triangle ABC direct on trace son semblable sur 
//AC etc...n fois, on trace aussi le semblable du triangle ABC
// sur AB etc...(aussi n fois). Attention angle renvoie 
//une valeur absolue (= valeur de l'angle non oriente)
spirale2(A,B,C,n):={
local k,t,B0,C0;
triangle(A,B,C);
k:=longueur(A,C)/longueur(A,B);
t:=angle(A,B,C);
B0:=B;
C0:=C;
for (j:=1;j<=n;j++){
 B:=C; 
 C:=similitude(A,k,t,B);
 triangle(A,B,C);
};
B:=B0;
C:=C0;
for (j:=1;j<=n;j++){
 C:=B; 
 B:=similitude(A,1/k,-t,C);
 triangle(A,B,C);
}
};

Le même dessin mais sans repasser sur le même trait :

//meme dessin que spirale2(A,B,C,n) mais sans repasser sur le meme trait
spirales2(A,B,C,n):={
local k,t,B0,C0;
triangle(A,B,C);
k:=longueur(A,C)/longueur(A,B);
t:=angle(A,B,C);
B0:=B;
C0:=C;
for (j:=1;j<=n;j++){
 B:=C; 
 C:=similitude(A,k,t,B);
 segment(B,C);
 segment(A,C);
};
B:=B0;
C:=C0;
for (j:=1;j<=n;j++){
 C:=B; 
 B:=similitude(A,1/k,-t,C);
 segment(B,C);
 segment(A,B);
}
};

7.2.2  Avec un programme récursif

Cette fois on a une seule façon de voir le dessin récursif : spiralers2(A,B,C,0) c’est le triangle(A,B,C) si n>0, spiralers2(A,B,C,n) est formé des segments ACn et C(n-1)Cn, de spiraler1s(A,B,C,n-1) puis dessegments ABn et B(n-1)Bn.
On tape :

//meme dessin que spirale2(A,B,C,n) mais en recursif 
//cette fois on a une seule facon de voir le dessin 
//(analogue a spiraler1s)
//et sans repasser sur le meme trait 
//spiralers2(A,B,C,0)=triangle(A,B,C) si n>0,
//spiralers2(A,B,C,n)=segments AN et MN et spiraler1s(A,B,C,n-1)
//et segments AQ et PQ (M=C(n-1),N=Cn,P=B(n-1),Q=Bn)
spiralers2(A,B,C,n):={
local k,t,M,N,P,Q;
k:=longueur(A,C)/longueur(A,B);
t:=angle(A,B,C);
if (n>0) {
 M:=similitude(A,k^n,n*t,B);
 N:=similitude(A,k,t,M);
 segment(M,N);
 segment(A,N);
 spiralers2(A,B,C,n-1);
 P:=similitude(A,1/k^n,-n*t,C);
 Q:=similitude(A,1/k,-t,P);
 segment(P,Q);
 segment(A,Q);
   } else 
 triangle(A,B,C);
};

On peut aussi rajouter un paramètre s supplémentaire qui donnera le sens du triangle ABC : s=1 si le triangle ABC est direct et s=-1 sinpn.
On tape :

//spiraler2s(A,B,C,1,3) + spiraler2s(A,C,B,-1,3)
//equivalent a spiralers2(A,B,C,3)
//s= signe de l'angle oriente (AB,AC) car angle(A,B,C)=val abs de cet angle 
spiraler2s(A,B,C,s,n):={
local k,t;
k:=longueur(A,C)/longueur(A,B);
t:=angle(A,B,C);
if (n>0) {
 //triangle(A,B,C);
 segment(A,B);
 segment(B,C);
 B:=similitude(A,k,s*t,B);
 C:=similitude(A,k,s*t,C);
 spiraler2s(A,B,C,s,n-1);
   } else {
 triangle(A,B,C);
}
}
Retour à la page personnelle de Bernard Parisse.
Previous Up Next