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

Chapitre 10  Quelques exemples de récursivité

10.1  Récursivité ayant un seul appel récursif

On commence par des exemples simples.

10.1.1  Les carrés

On trace un carré puis le carré qui joint les milieux des cotés etc... on s’arrête quand les segments à dessiner deviennent trop petits ou quand on a un dessin de profondeur n (n est le nombre d’étapes necessaires pour réaliser le dessin).
On tape dans un éditeur de programme (que l’on ouvre avec Alt+p), puis on valide avec OK :

 
carres(A,B):={
local L;
L:=carre(A,B);
if (longueur2(A,B)>0.01) {
  L:=L,carres(A+(B-A)/2,B+(B-A)*i/2);
}
return L;
};

On tape :
carres(point(-1),point(1)) :
On obtient :

On obtient le dessin des carrés avec le tracé qui est fait du plus grand au plus petit : le dessin du carré (-1,1,1+2*i,-1+2*i) puis du carré (0,1+i,i,-1+i)....
bf Remarque si on tape

 
carres2(A,B):={
local L;
if (longueur2(A,B)>0.01) {
  L:=L,carres2(A+(B-A)/2,B+(B-A)*i/2);
}
L:=L,carre(A,B);
return L;
};

puis :
carres2(-1.0,1.0)
le dessin des carrés ne se fera pas dans le même ordre et se fera du plus petit au plus grand.
Autre test d’arrêt On peut avoir besion de connaitre le nombre de n de fois que l’on fait le ou les appels récursifs pour avoir un dessin de "profondeur" n. On rajoute pour cela un paramètre qui sera la profondeur.
Dans l’exemple ci-dessus, on tape dans un éditeur de programme (que l’on ouvre avec Alt+p), puis on valide avec OK le programme :

 
carrep(A,B,n):={
local L;
L:=carre(A,B);
 if (n==0) return NULL;
 L:=L,carrep(A+(B-A)/2,B+(B-A)*i/2,n-1);
return L;
};

On tape :
carrep(-1.0,1.0,5)
On obtient le dessin des carrés du plus grand au plus petit et de profondeur 5

Généralisation
On trace un carré ABCD, puis le carré MNPQ avec :
AM=a*AB,
BN=a*BC,
CO=a*CD,
DP=a*DA,
a est un nombre réel entre 0 et 1.

 
carresp(A,B,a):={
local L;
L:=carre(A,B);
if (longueur2(A,B)>0.01) {
L:=L,carresp(A+(B-A)*a,B+(B-A)*i*a,a);
}
return L;
}:;

On tape par exemple :
carresp(-1.0,1.0,0.2) On obtient :

10.1.2  Les triangles

On trace un triangle puis le triangle qui joint les milieux des cotés etc...on s’arrête quand les segments à dessiner deviennent trop petits.
On tape dans un éditeur de programme (que l’on ouvre avec Alt+p), puis on valide avec OK :

 
triangles(A,B,C):={
local L;
L:=triangle(A,B,C);
if (longueur2(A,B)>0.01) {
   L:=L,triangles(A+(B-A)/2,B+(C-B)/2,C+(A-C)/2);
}
return L};

On tape :
triangles(-2.0,1,2*i)
On obtient le dessin des triangles du plus grand au plus petit :le dessin du triangle (-2,1,2*i) puis du triangle (-0.5,0.5+i,-1+i,)....

Remarque si on tape

 
trianglesp(A,B,C):={
local L;
if (longueur2(A,B)>0.01) {
  L:=L,trianglesp(A+(B-A)/2,B+(C-B)/2,C+(A-C)/2);
}
L:=L,triangle(A,B,C);
return L};

On tape :
trianglesp(-2.0,1,2*i)
On obtient le même dessin, mais le tracé des triangles ne se fera pas dans le même ordre et se feradu plus petit au plus grand.
Généralisation
On trace un triangle ABC, puis le triangle MNP avec :
AM=a*AB,
BN=a*BC,
CO=a*CD,
a est un nombre réel entre 0 et 1.

 
trianglea(A,B,C,a):={
local L;
L:=triangle(A,B,C);
if (longueur2(A,B)>0.01) {
L:=L,trianglep(A+(B-A)*a,B+(C-B)*a,C+(A-C)*a,a);
}
return L}:;

On tape par exemple :
trianglea(-2.0,1.0,2*i,0.2)
On obtient :

10.2  Récursivité ayant plusieurs appels récursifs

Voici des exemples encore assez simples.

10.2.1  Les triangles

On trace un triangle puis on joint les milieux des cotés.
On obtient ainsi 4 petits triangles semblables au précédent.
On recommence le même processus avec les trois triangles qui ont un angle commun avec le grand triangle et ainsi de suite.....on s’arrête quand les segments à dessiner deviennent trop petits.
On tape dans un éditeur de programme (que l’on ouvre avec Alt+p), puis on valide avec OK :

 
triangle3(A,B,C):={
local L;
L:=triangle(A,B,C);
 if (longueur2(A,B)<0.005) return NULL;
 L:=L,triangle3(A,A+(B-A)/2,C+(A-C)/2);
 L:=L,triangle3(A+(B-A)/2,B,B+(C-B)/2);
 L:=L,triangle3(C+(A-C)/2,B+(C-B)/2,C);
return L;
};

On tape par exemple :
triangle3(-2.0,1.0,2*i)
On obtient :

Remarque
Le tracé du triangle ne peut se faire qu’a la fin car il suffit de tracer les derniers petits triangles on écrit donc dans un éditeur de programme (que l’on ouvre avec Alt+p), puis on valide avec OK :

 
trianglep(A,B,C):={
local L:=NULL;
if (longueur2(A,B)<0.01) {return triangle(A,B,C);}
L:=L,trianglep(A,A+(B-A)/2,C+(A-C)/2);
L:=L,trianglep(A+(B-A)/2,B,B+(C-B)/2);
L:=L,trianglep(C+(A-C)/2,B+(C-B)/2,C);
return L;
};

On tape par exemple :
trianglep(-2.0,1.0,2*i)
On obtient le même dessin.

Généralisation
On trace un triangle ABC, puis le triangle MNP avec :
AM=a*AB,
BN=a*BC,
CO=a*CD,
a est un nombre réel entre 0 et 1.

 
triangle3p(A,B,C,a):={
local L:=NULL;
if (longueur2(A,B)<0.02) {return triangle(A,B,C);}
L:=L,triangle3p(A,A+(B-A)*a,C+(A-C)*a,a);
L:=L,triangle3p(A+(B-A)*a,B,B+(C-B)*a,a);
L:=L,triangle3p(C+(A-C)*a,B+(C-B)*a,C,a);
return L;
}:;

On tape par exemple :
triangle3p(-2.0,1.0,2*i,0.6)
On obtient :

Et avec un autre test d’arrêt en utilisant la profondeur n du dessin :

 
triangle3an(A,B,C,a,n):={
local L;
if (n==0) {return triangle(A,B,C);}
L:=L,triangle3an(A,A+(B-A)*a,C+(A-C)*a,a,n-1);
L:=L,triangle3an(A+(B-A)*a,B,B+(C-B)*a,a,n-1);
L:=L,triangle3an(C+(A-C)*a,B+(C-B)*a,C,a,n-1);
return L;
}:;

On tape par exemple :
triangle3an(-2.0,1.0,2*i,0.6,3)
0n obtient un dessin de profondeur 3 :

10.2.2  Les hexagones

On considère un hexagone de coés de longueur l, on remplace cet hexagone par 7 hexagones de cotés de longueur l/3 qui sont :les 6 hexagones ayant un angle commun avec l’hexagone de départ et un septième hexagone se trouvant au centre comme sur la figure :

On obtient ainsi 7 petits hexagones semblables au précédent et on recommence le même processus.

On tape la fonction hexago ou on utilise la commande hexagone de Xcas :

 
// dessin d'un hexagone
hexago(x,y):={
local a,b,c,L;
a:=x;
b:=y;
L:=NULL;
for (j:=1;j<=6;j++) {
c:=a+(b-a)*exp(evalf(i*pi*2/3));
L:=L,segment(a,c);
b:=a;
a:=c;
}
return L;
}:;

puis on fait un premier appel récursif correspondant à l’hexagone du centre et avec la même itération que dans la fonction hexago, on fait un appel récursif au lieu de tracer un segment pour les hexagones des angles, on tape :

hexagones(a,b,n):={
local j,c,L;
L:=NULL;
if (n==0) {return hexago(a,b);}
c:=a+(b-a)*2/3*exp(evalf(i*pi/3));
// dessin de l'hexagone central
L:=L,hexagones(c,c+(b-a)/3, n-1);
//dessin des 6 hexagones dans les angles
for (j:=1;j<=6;j++) {
c:=a+(b-a)*exp(evalf(i*pi*2/3));
L:=L,hexagones(c,c+(a-c)/3,n-1);
b:=a;
a:=c;
} 
return L;};

On tape :
hexagone(point(-1),point(1)),hexagones(-1,1,3)
On obtient :

10.2.3  Les polygones réguliers

On part d’un polygone régulier P à k sommets et on le remplace par k polygones réguliers à k sommets de façon à ce que ces k polygones aient chacun un angle commun avec P et de façon à ce qu’ils ne se chevauchent pas. Puis on contine le processus et on ne dessine que les derniers petits polygones.
Par exemple un hexagone H de coté a est remplacé par 6 hexagones de côtés a/3 obtenus par homothétie de rapport 1/3 et de centre les sommets de l’hexagone H.
Pour écrire une procédure générale il faut faire un peu de trigonométrie.
Le calcul du coté h du petit polygone k-régulier doit vérifier :
- si k=3, 4 on a h=(ba)/2
- si k=5, 6, 7, 8 on a h+hcos(2π/k)=(ba)/2
- si k=9, 10, 11, 12, 13, 14, 15, 16 on a :
h+hcos(2π/k)+hcos(4π/k)=(ba)/2 - si p=iquo(k-1,4), on a :
hl=0p cos(2pπ/k)=(ba)/2
On a donc :
s=∑l=0p cos(2pπ/k)=(sin((2p+1)π/k)+sin(π/k))/(2sin(π/k))
donc h=(ba)/2/s
et on tape :

//napperon de Cantor ou de Sierpinski k=3,4...
//utilise isopolygone(a,b,k) k>0 
//ex polyserp(-1-2*i,1-2*i,5,3); polyserp(-2*i,1-2*i,9,2)
polyserp(a,b,k,n):={
local c,h,j,q,p,s,L;
if (n==0) {return isopolygone(a,b,k);}
//pour k=3 ou 4  h:=(b-a)/3;
//pour k=5,6,7,8 h:=(b-a)/2/(cos(evalf(2*pi/k))+1);
//pour autre k il faut calculer s avec la trigo ou avec
//s:=1;for (l:=1;l<=iquo(k-1,4);l++){s:=s+cos(2*l*evalf(pi)/k);} 
p:=iquo(k-1,4);
s:=(sin(evalf(pi)/k)+sin((2*p+1)*evalf(pi)/k))/
    2/sin(evalf(pi)/k);
for (j:=1;j<=k;j++) {
h:=(b-a)/2/s;
L:=L,polyserp(a,a+h,k,n-1);
c:=a+(b-a)*exp(evalf(i*pi*(k-2)/k));
b:=a;
a:=c;
}
retourne L;
};

On tape :
polyserp(-1-2*i,1-2*i,5,3)
On obtient :

On tape :
polyserp(-2*i,1-2*i,9,2)
On obtient :

Le programme du dessin d’un polygone régulier à k cotés peut vous aider á comprendre le programme précédent.

 
// dessin d'un polygone regulier de k cotes
polyreg(x,y,k):={
local a,b,c;
a:=x;
b:=y;
DispG();
for (j:=1;j<=k;j++) {
c:=a+(b-a)*exp(evalf(i*pi*(k-2)/k));
segment(a,c);
b:=a;
a:=c;
}
};

Dans Xcas, pour tracer un polygone régulier, on utilise la commande isopolygone. Remarque
Une faute de signe peut vous faire voir de jolis dessins pour k=7,8...et n=2

//utilise polyreg(a,b,k) k>0 k=nb de cotes
//ex polyserr(-2*i,1-2*i,8,2); polyserr(-2*i,1-2*i,9,2)
polyserr(a,b,k,n):={
local c,h,j,q,p,s,L;
L:=NULL;
if (n==0) return isopolygone(a,b,k);
//if (n==0) {return polyreg(a,b,k);}
p:=iquo(k-1,4);
s:=(sin(evalf(pi)/k)-sin((2*p+1)*evalf(pi)/k))/
    2/sin(evalf(pi)/k);
for (j:=1;j<=k;j++) {
if ( s!=0) h:=(b-a)/2/s; else h:=(b-a)/3;
L:=L,polyserr(a,a+h,k,n-1);
c:=a+(b-a)*exp(evalf(i*pi*(k-2)/k));
b:=a;
a:=c;
}
return L;
};

On tape :
polyserr(-2*i,1-2*i,8,2)
On obtient :

Un autre dessin avec des octogones en traçant un octogone au centre et 8 octogones dans les angles :

polyserp8(a,b,n):={
local c,h,j,q,p,s,k,L;
if (n==0) return isopolygone(a,b,8);
k:=8;
//if (n==0) {return polyreg(a,b,k);}
p:=iquo(k-1,4);
s:=(sin(evalf(pi)/k)+sin((2*p+1)*evalf(pi)/k))/
    2/sin(evalf(pi)/k);
h:=(b-a)/2/s;
L:=polyserp8(a+h+i*h*(sqrt(2)+1),a+h*(sqrt(2)+1)+i*h*(sqrt(2)+1),n-1);
for (j:=1;j<=k;j++) {
L:=L,polyserp8(a,a+h,n-1);
c:=a+(b-a)*exp(evalf(i*pi*(k-2)/k));
b:=a;
a:=c;
h:=(b-a)/2/s;
}
return L;
};

On tape :
polyserp8(-2*i,1-2*i,3)
On obtient :

10.2.4  Le napperon de Cantor ou de Sierpinski avec des points aléatoires

On tape :

Sierpinski(n):={
local T,j,N,x,y,r;
T:=triangle_equilateral(-1/2-i*sqrt(3)/4,1/2-i*sqrt(3)/4,affichage=rouge);
z:=0;
N:=[0$n];
N[0]=<point(0,affichage=point_point)
pour j de 1 jusque n faire
r:=alea(3);
si r==0 alors
  x:=(-1/2+x)/2.;
  y:=(-sqrt(3)/4+y)/2.;
sinon
  si r==1 alors
    x:=(1/2+x)/2.;
    y:=(-sqrt(3)/4+y)/2.;
  sinon
    x:=x/2.;
    y:=(sqrt(3)/4+y)/2.;
  fsi;
fsi;
N[j]=<point(x,y,affichage=point_point)
fpour
retourne(T,N);
}
:;

On tape :
Sierpinski(10000)
On obtient :

Pour comprendre on reprend le programme :

polyserp(a,b,k,n):={
local c,h,j,q,p,s,L;
if (n==0) {return isopolygone(a,b,k);}
//pour k=3 ou 4  h:=(b-a)/3;
//pour k=5,6,7,8 h:=(b-a)/2/(cos(evalf(2*pi/k))+1);
//pour autre k il faut calculer s avec la trigo ou avec
//s:=1;for (l:=1;l<=iquo(k-1,4);l++){s:=s+cos(2*l*evalf(pi)/k);} 
p:=iquo(k-1,4);
s:=(sin(evalf(pi)/k)+sin((2*p+1)*evalf(pi)/k))/
    2/sin(evalf(pi)/k);
for (j:=1;j<=k;j++) {
h:=(b-a)/2/s;
L:=L,polyserp(a,a+h,k,n-1);
c:=a+(b-a)*exp(evalf(i*pi*(k-2)/k));
b:=a;
a:=c;
}
retourne L;
}:;

et on tape :
Sierpinski(6),polyserp(-1/2-i*sqrt(3)/4,1/2-i*sqrt(3)/4,3,4) avec pour Sierpinski(6) 7 gros points aléatoires de couleurs 0,1...6. On a fait 6 tirages qui sont : 2, 1, 1, 1, 0 ,0.
On obtient :

10.2.5  Le flocon

Tous les programmes qui sont dans cette section se trouve dans le fichier :
flocon.cas On considère un segment AB et on place las points PQR tels que :
3*AP=AB
3*BQ=BA
et le triangle PQR est équilatèral direct.
On remplace alors le tracé du segment AB par le tracé APRQB.
On continue en faisant subir le même traitement aux 4 segments AP,PR,RQ,QB...on s’arrête quand la longueur des segments devient trop petite ou quand la profondeur est nulle.
Il y a donc 4 appels récursifs.

 
flocon(A,B):={
local L;
L:=NULL;
if (longueur2(A,B)<0.005) {return segment(A,B);}
L:=L,flocon(A,A+(B-A)/3);
L:=L,flocon(A+(B-A)/3,A+(B-A)/3*(1+exp(i*pi/3)));
L:=L,flocon(A+(B-A)/3*(1+exp(i*pi/3)),A+2*(B-A)/3);
L:=L,flocon(A+2*(B-A)/3,B);
return L;
}:;

On tape par exemple :
flocon(-1.0,1.0)
On obtient :

ou avec la profondeur :

 
floconp(A,B,n):={
local h,L;
L:=NULL;
if (n==0) {return segment(A,B);}
h:=(B-A)/3;
L:=L,floconp(A,A+h,n-1);
L:=L,floconp(A+h,A+h*(1+exp(i*pi/3)),n-1);
L:=L,floconp(A+h*(1+exp(i*pi/3)),A+2*h,n-1);
L:=L,floconp(A+2*h,B,n-1);
return L;
}:;

On tape par exemple :
floconp(-2.0,2.0,5)
On obtient :

Généralisation
On coupe le segment initial AB en trois en placant P et Q de façon à avoir :
AP=a*AB
BQ=a*BA
avec 0.25< a <0.5. puis on construit un triangle isocéle PQR tel que PR=QR=AP . On remplace le segment AB par les segments APRQB et on recommence le processus. Il y a donc 4 appels récursifs.

 
flocong(A,B,a,n):={
local h,t,L;
L:=NULL;
if (n==0) {return segment(A,B);}
t:=acos((0.5-a)/a);
h:=(B-A)*a;
L:=L,flocong(A,A+h,a,n-1);
L:=L,flocong(A+h,A+h*(1+exp(i*t)),a,n-1);
L:=L,flocong(A+h*(1+exp(i*t)),B-h,a,n-1);
L:=L,flocong(B-h,B,a,n-1);
return L;
}:;

On tape par exemple :
flocong(-2.0,2.0,0.4,4)
On obtient :

10.2.6  Le tapis carré

Ces programmes se trouvent dans examples/recur/carre.cxx.
On trace un carré puis puis on partage les cotés de ce carré en trois partie égales. On obtient ainsi 9 carrés.
On recommence le même processus avec les 8 carrés qui ont un coté commun avec le grand carré et ainsi de suite.....on s’arrête quand les segments à dessiner deviennent trop petits. Il y a donc 8 appels récursifs.
On tape dans un éditeur de programme (que l’on ouvre avec Alt+p), puis on valide avec OK :

 
carre8(A,B):={
local h,L;
L:=carre(A,B);
if (longueur2(A,B)<0.005) return NULL;
h:=(B-A)/3;
L:=L,carre8(A,A+h);
L:=L,carre8(A+h,A+2*h);
L:=L,carre8(A+2*h,B);
L:=L,carre8(A+i*h,A+i*h+h);
L:=L,carre8(A+i*h+2*h,B+i*h);
L:=L,carre8(A+2*i*h,A+2*i*h+h);
L:=L,carre8(A+2*i*h+h,A+2*i*h+2*h);
L:=L,carre8(A+2*i*h+2*h,B+2*i*h);
return L;
}:;

On tape par exemple :
carre8(-1.0,1.0)
On obtient :

Autre test d’arrêt
On peut avoir besion de connaitre le nombre de n de fois que l’on fait le ou les appels récursifs pour avoir un dessin de "profondeur" n. On rajoute pour cela un paramètre qui sera la profondeur.
Dans l’exemple ci-dessus, on tape dans un éditeur de programme (que l’on ouvre avec Alt+p), puis on valide avec OK le programme :

 
carre8p(A,B,n):={
local h,L;
h:=(B-A)/3;
L:=carre(A,B);
if (n==0)  return NULL;
h:=(B-A)/3;
L:=L,carre8p(A,A+h,n-1);
L:=L,carre8p(A+h,A+2*h,n-1);
L:=L,carre8p(A+2*h,B,n-1);
L:=L,carre8p(A+i*h,A+i*h+h,n-1);
L:=L,carre8p(A+i*h+2*h,B+i*h,n-1);
L:=L,carre8p(A+2*i*h,A+2*i*h+h,n-1);
L:=L,carre8p(A+2*i*h+h,A+2*i*h+2*h,n-1);
L:=L,carre8p(A+2*i*h+2*h,B+2*i*h,n-1);
return L;
}:;

On tape par exemple :
carre8p(-1.0,1.0,4) On obtient le même dessin

10.2.7  Une courbe de Péano

Ces programmes se trouvent dans examples/recur/peano.cxx.
On trace la diagonale AC d’un carré ABCD.
Puis puis on partage les cotés de ce carrés en trois partie égales. On obtient ainsi 9 carrés.
On remplace alors la diagonale du carré précédent par les diagonales des 9 carrés de façon à avoir une ligne continue allant de A à C. On recommence le même processus avec les 9 carrés de façon à avoir une ligne continue allant de A à C, et ainsi de suite.....on s’arrête quand les segments à dessiner deviennent trop petits.
On a choisit comme paramètre les affixes des points A et B et d’utiliser la profondeur comme test d’arrêt.
On tape dans un éditeur de programme (que l’on ouvre avec Alt+p), puis on valide avec OK : ou on utilise la commande :
read("peano.cas") car ce progrmme se trouve dans le fichier peano.cas.

 
//arc qui remplit le carre de cote x,y 
peano(x,y,n):={
local u,v,L;
u:=(y-x)/3;
v:=i*u;
L:=NULL;
if (n==0) {return segment(x,y+3*v);}
L:=L,peano(x,x+u,n-1);
L:=L,peano(x+u+v,x+u,n-1);
L:=L,peano(x+2*u,y,n-1);
L:=L,peano(y+v,y+2*v,n-1);
L:=L,peano(x+2*(u+v),x+u+2*v,n-1);
L:=L,peano(x+(u+v),x+u+2*v,n-1);
L:=L,peano(x+2*v,x+2*v+u,n-1);
L:=L,peano(x+3*v+u,x+u+2*v,n-1);
L:=L,peano(x+2*(u+v),y+2*v,n-1);
return L;
}:;

On tape par exemple :
peano(-i,3-i,3)
On obtient :

Vous pouvez voir les différentes étapes de la construction en faisant successivement n=1,2,3,4 en utilisant le bouton stop si le tracé est trop long.

10.3  Quelques dessins doublement récursifs

Dans ce chapitre on va faire des dessins qui obligent à écrire plusieurs procédures récursives qui s’appellent l’une l’autre.

10.3.1  Les trapèzes

On considère les trapèzes ABCD rectangle en A et D et tel que AB=2DC=2AD. On dira que l’on a un trapèze droit si l’angle AB,AS=+π/2 et sinon ce sera un trapèze gauche. Voici le programme du dessin du trapèze gauche et du trapèze droit : (le paramètre a est l’affixe de A et b est l’affixe de B)

trapd(a,b):={
local c,d,L;
L:=segment(a,b);
L:=L,segment(a,a+i*(b-a)/2);
L:=L,segment(a+i*(b-a)/2,(a+b)/2+i*(b-a)/2);
L:=L,segment(b,(a+b)/2+i*(b-a)/2);
retourne L;
}:;
trapg(a,b):={
local c,d,L;
L:=segment(a,b);
L:=L,segment(a,a-i*(b-a)/2);
L:=L,segment(a-i*(b-a)/2,(a+b)/2-i*(b-a)/2);
L:=L,segment(b,(a+b)/2-i*(b-a)/2);
retourne L;
}:;

On tape :
trapg(0,10),trapd(10,20)
On obtient :

On partage le trapèze droit en 3 trapèzes droits et un trapèze gauche et le trapèze gauche en 3 trapèzes gauches et un trapèze droit :

Puis on continue le même processus, on tape : (a et b sont les affixes de A et de B, n=1 trace un trapèze, n=2 dessine le partage (soit 4en 3 trap), n=3e AB. On dira qu seo gauches epè3e ABisant] -=Dtrapd(a,b):={ r{ local c,h,j,q,pL; if (n==0)glen x:=(-1 L; }:;

an={gr( local c,h,j,q,pL; if (n==0)glen x:=(-1 L; h:=(B-A); N[j]ngl):={ localiangle3an={ r{*(b-a)/L:=L,triangle3an={gr( -,(a+b)/2+i:=L,triangle3an={gr(b23*aa-b/242,(aa-b/24,b+aa-b/242,(aa-b/24,L,triangle3an={gr(*(b-a)/Lbturn L; }:;

On tape :
g(0,10),trrTT>< On ;an={ r{T> 100P>

10.2.64/A>  Les hexagonessphinxOn considprograt carre8pIphinxdlocal a,b,c,L; z,uNULL; if (n==0)z:=,y+2*:=i*u;f(i*pi*(k-2pi); rfloct:= y+(x-y*u;f(i*p-i*(k-2pi); rfloc3; t+(x-y*u;gment(b,(a+b)/2x,zegment(b,(a+b)/2z,uegment(b,(a+b)/2uNUegment(b,(a+b)/2tcalgment(b,(a+b)/2y,x L; }:;

Iphinxglocal a,b,c,L; z,uNULL; if (n==0)z:=); r(x-y*u;f(i*p-i*(k-2pi); rfloct:= +u+:=i*u;f(i*pi*(k-2pi); rfloc3; t+(:=i*u; Lent(b,(a+b)/2y,zegment(b,(a+b)/2z,uegment(b,(a+b)/2uNUegment(b,(a+b)/2tcxegment(b,(a+b)/2xcalgm }:;

On tape :
trapg(0,1Iphinxdlpd(),Iphinxgl1.2,2BR> On obtient :
10R> Pour compdprograt carre8pIphinxd4local a,b,c,L; z,uNULL; if (n==0)z:=,y+2*:=i*u;f(i*p L4; rfloct:= y+(x-y*u;f(i*p- L4; rfloc3; t+(x-y*u;gment(b,(a+b)/2x,zegment(b,(a+b)/2z,uegment(b,(a+b)/2uNUegment(b,(a+b)/2tcalgment(b,(a+b)/2y,x L;ent(b,phinxgloc),yyL,segment(b,phinxgl),yyL,scalgment(b,phinxglt,t+(x-y*usegment(b,phinxd2z,(3*x+z/24 L; }:;

Iphinxg4local a,b,c,L; z,uNULL; if (n==0)z:=); r(x-y*u;f(i*p-i*(k-2pi); rfloct:= +u+:=i*u;f(i*pi*(k-2pi); rfloc3; t+(:=i*u; Lent(b,(a+b)/2y,zegment(b,(a+b)/2z,uegment(b,(a+b)/2uNUegment(b,(a+b)/2tcxegment(b,(a+b)/2xcalgment(b,phinxd2oc),yyL,segment(b,phinxdl),yyL,scalgment(b,phinxd(t+(:=i*u2NUegment(b,phinxgl)3*y+z/24,zegm }:;

On tape :
trapg(0,1Iphinxd4lpd(),Iphinxg4l1.2,2BR> On obtient :
10R> RemarqEire ograt celaon hexages qui sappela commande hexages qui sa(0,1Iphinxgs{ localle tramta(0,1Iphinxgs{ localle trambre re hexages qui sappela commande hexages qui sa(0,1Iphinxds{ localle tr)E CLASS="verbatim"> //arc qIphinxds{ local a,b,c,L; z,uNULL; return NULL; L:=L,carz:=,y+2*:=i*u;f(i*pi*(k-2pi); rfloct:= y+(x-y*u;f(i*p-i*(k-2pi); rfloc3; t+(x-y*u;gment=L,carent(b,(a+b)/2x,zegment(b,(a+b)/2z,uegment(b,(a+b)/2uNUegment(b,(a+b)/2tcalgment(b,(a+b)/2y,x L;ent(b,phinxgs2oc),yyL,s,L,triangle3,phinxgs2),yyL,sca,L,triangle3,phinxgs2t,t+(x-y*us,L,triangle3,phinxds{z,(3*x+z/24turn L; }:;

Iphinxgs{ local a,b,c,L; z,uNULpLL; return NULL; L:=L,carif (n==0)z:=); r(x-y*u;f(i*p-i*(k-2pi); rfloct:= +u+:=i*u;f(i*pi*(k-2pi); rfloc3; t+(:=i*u; Lent(b,(a+b)/2y,zegment(b,(a+b)/2z,uegment(b,(a+b)/2uNUegment(b,(a+b)/2tcxegment(b,(a+b)/2xcalgment(b,phinxds2oc),yyL,s,L,triangle3,phinxds2),yyL,sca,L,triangle3,phinxds2t+(:=i*u2NU,L,triangle3,phinxgs2)3*y+z/24,zturn L; }:;

On tape :
trapg(0,1Iphinxdslpd( : On obtient :
10R> ou ilissez simeine que lesutonn a ua petittrape il fauhexagt mmta0.52sx:=(-1 n a Iphind2*i),RBR> mmta0.83sE CLASS="verbatim">trapd(a,bIphinxdps{ local a,b,c,L; z,uNULL; if (n==0) {return triangle(Iphinxdlocal;})z:=,y+2*:=i*u;f(i*pi*(k-2pi); rfloct:= y+(x-y*u;f(i*p-i*(k-2pi); rfloc3; t+(x-y*u;gment(b,phinxgps2oc),yyL,s,L,triangle3,phinxgps2),yyL,sca,L,triangle3,phinxgps2t,t+(x-y*us,L,triangle3,phinxdps{z,(3*x+z/24turn L; }:;

,phinxgps2ococal a,b,c,L; z,uNULpLL; if (n==0) {return triangle(Iphinxglocal;})z:=); r(x-y*u;f(i*p-i*(k-2pi); rfloct:= +u+:=i*u;f(i*pi*(k-2pi); rfloc3; t+(:=i*u; Lent(b,phinxdps{ l),yyL,s,L,triangle3,phinxdps2),yyL,sca,L,triangle3,phinxdps2t+(:=i*u2NU,L,triangle3,phinxgps2)3*y+z/24,zturn L; }:;

On tape :
trapg(0,1Iphinxdpslpd( : On obtient :

ABet ichier Iphinx 3 tra,at ABsinen trBR> trapd(a,bIphinxdpst{ local a,b,c,L; z,uNULL; if (n==0) {return tiangle(Iphinxdlocal;)z:=,y+2*:=i*u;f(i*pi*(k-2pi); rfloct:= y+(x-y*u;f(i*p-i*(k-2pi); rfloc3; t+(x-y*u;gment(b,phinxgpst2oc),yyL,s,L,triangle3,phinxgpst2),yyL,sca,L,triangle3,(a+b)/2tct+(x-y*u;riangle3,phinxdpst{z,(3*x+z/24turn L; }:;

Iphinxgpst{ local a,b,c,L; z,uNULpLL; if (n==0) {return tiangle(Iphinxglocal;)z:=); r(x-y*u;f(i*p-i*(k-2pi); rfloct:= +u+:=i*u;f(i*pi*(k-2pi); rfloc3; t+(:=i*u; Lent(b,phinxdpst2oc),yyL,s,L,triangle3,phinxdpst2),yyL,sca,L,triangle3,(a+b)/2t+(:=i*u;NUegment(b,phinxgpst2)3*y+z/24,zturn L; }:;

On tape :
trapg(0,1Iphinxdpstlpd( : On obtient :
104P>

10.2.65/A>  Les polygon 3 des On considèrmande uxI>A et B et d’ut(rpinsuxI nb sont les ppel affixe de B)c A)commence les trapèzI>ABCD. On anglee 1 ju AC d> On continL AB par les se besde AB par les segments nsuxII>a . On dira/I> et tBetit pol>ABCD./3 qr les sou at AB par les se besde AB par les segments nsuxII>a . OnCdira/I> et CBetit pol>ABCD./3 qr les .prendron A estn dira)commàn de des 3 trap(et tBetit)com apendron A estnCdira)commàn de des 3 trap(et CBetit)a choisit cAP=a)/2/cP . iA et b)/2/cP sont lesI>)/2/dSUB> . iA et b)/2/dP s=∑cba)/2/iAs<−as)/2/iA On ndeur n du dessince cismmàn R> Oe de n e il fauhexaPRE CLASS="verbatim"> flocon( d'un polen de des 3 des g)

d'un polen de des 3 des d)

On tape :
trapg(0,13 des g) 105> Remarque
Le tracéIl du plucilapes nar hoirructioéano< < des e appesutonutre.A,B)& b> de fois ql’ogureA HREsin <,t cjodurême ordre et seaPR L(-1ne serapèprogoofondeb> >
ments plie : ( uctb> kk uctdes segmen < des egme√ lole"ra quPAN continSa-grezre voipru dessirrlee des 3> uctb> mon a ue< des 3 tralacé le deshexagonla nsuxxagonemtraiiangl uctb> hexagg(0,13 des appeadle trambrede hexagg(0,13 des appeagle tramn on ngeuton 3 trapèz3 traai de èz t dnoctogoagonla petittrapin en faisaE CLASS="verbatim"> //arc q3 des appeag{ local u,v,L; u:=(y-a,b; for (j:=1 {return e,y+3*v);} Ll; }:;

3 des appead( local u,v,L; u:=(y-a,b; for (j:=1 {return e,y+3*v);} Ll; }:;

On tape :
trapg(0,13 des appeag{-3 On obtient le dessin des des 3xemple cnc dapfor (R> On obs pouvezograutre e/I> goluhexag/I> d le ptrapè.
ivéaptaale dr trouvee etpetits nt aux. hapitre oainue le nomn des un septiale dr trouveedes un sep t < des 3 traarracéce cismmnion les h. //arc q3 des apeag{ local u,v,L; u:=(y-a,b; for (j:=1 {return e,y+3*v);} Ll; }:;

3 des apead( local u,v,L; u:=(y-a,b; for (j:=1 {return e,y+3*v);} Ll; }:;

On tape par exemple :
peano(-i,3 des apeag{-3TT3BR> On obtient le dessin des des 3xemple cnc dapfor (R> On CLASS="subsection">
10.3.16/A>  Le napperDsuxIIoéanso

carrés rcleOn considParmin n

re deseapt u procnsuxI dans cettecarrés rcle choiCemes se trouvent dans examples/recur/peano.cxx.
On CLASS="4ubsection"><">
//arc q remplx y gl ouvral+2*h, R>cglocal a,b }:; cdlocal a,b }:; On tape pontinue nc danson hexagogle tra(t àgodle tr) >peanoSoessinP>uxI>A
et BBb sonBI>BBhexagogle tr : (cI>,ASBBa)/2/s<>(/2/iAπ/3)/*t)I>)/2/ex/(I>)/2/iAπ/3)/kcgle trs puis endron hexagodle tr : (cI>,AS)π/3,usituDBBa)/2/s<>(I>)/2/iAπ/3)/*t)I>)/2/ex/(/2/iAπ/3)/kcd> On trace la e segmeneaPon sgocgle tra(t àgocdle tr) xemp13 R>cagl ouvral π/3erpinskouvralI>)π/3entdesn des triann ouvre avec dessiner exea g(-2TT>d(-2TT>uxIBR> Leins choiEtnue le même eaplliqua ca ea e segmuton cgle tra(t àgocdle tr) xemp13 R>caE CLASS="verbatim"> //arc q re Péano>OKcautree :d(-2TT>d( local u,v,L; u:c1:=x; d,e1,f,g,h,i1,j,k,l,mLL; if (n==0) {return segment(Aarc( loc-p rflo} c1; +u+:=i*;(i*pi*(k-2pi);2; rflu; Lb; +u+:=i*u;f(i*pi*(k-2pi); rflocc; +u+:=i*u;f2f(i*pi*(k-2pi); rflocd:=c+(:=i*u; Le1; bu+2*:=i*u;; f:=c1u+:=i*;(15+/4,3,4)d(=x; L,peano(x+3d(; d,L,peano(x+3d(d,e1,L,peano(x+3d(e1,f,L,peano(x+3g(f,g,L,peano(x+3g(g,h,L,peano(x+3g(h,i1,L,peano(x+3d(i1,j,L,peano(x+3d(jc:=a+(b-ao(x+3g(k,l,a+(b-ao(x+3g(l,mLL,peano(x+3d(mL:=L,pean }:;

*(u+vglococal u,v,L; u:c1:=x; d,e1,f,g,h,i1,j,k,l,mLL; if (n==0) {return segment(Aarc( locp rflo} c1; +u+:=i*;(i*pi*(k-2-1); ); rflu; Lb; +u+:=i*u;f(i*pi*(k-2-pi); rflocc; +u+:=i*u;f2f(i*pi*(k-2-pi); rflocd:=c+(:=i*u; Le1; bu+2*:=i*u;; f:=c1u+:=i*;(15-/4,3,4)g(=x; L,peano(x+3g(; d,L,peano(x+3g(d,e1,L,peano(x+3g(e1,f,L,peano(x+3d(f,g,L,peano(x+3d(g,h,L,peano(x+3d(h,i1,L,peano(x+3g(i1,j,L,peano(x+3g(jc:=a+(b-ao(x+3d(k,l,a+(b-ao(x+3d(l,mLL,peano(x+3g(mL:=L,pean }:;

On tape :
polyserp8(/TT>d(-2TT> 10/P>

<">polyserp8bants2oco) On obtienil du pe onosiangl 8 R>carrés rclegl ouvralπ/2erpinskouvralI>)π/2iangt ubutapdenmilieet BBb<:= etxl’+(sonyl’I>)/2/xABB Leins/I> et de ee :/3 et de et 8 octpol>ABCD polyserp8un2oco) On obtien f ldu pe onosiaengré cIgl ouvralπ/2et dnoctogodenmili=d de B=∑b)(sonyl’I>)/2/xAPonvin du trapèzdebantcontinÁ(soitis desc < "profondebant le ou le :
uxI>peano(-i,3>ux2oco) On obtien f ldu pe onosiaengré cIgl ouvralπ/2et dnoctogodenmili=d de B= b)/2/iA et yl’I>)/2/xAPonvin du trapèzdebantcontine le trapèze trois par9rianglesn trois ptte sectangle ..srianglesn trois oa diagonaleBR> ebant lunaleBR> ebantne aunaleBR> ebantdotés. avoir unear hoirr continue allant des’ar choisitnc danseaPon sgammes qrécursiv>polyserp8(/TT>0le trappelu ubutapxempoleBR> 1le trappelu ubutapxempoleBR> 2le trappelu ubutapxempoleBR> dotle tr polysTapeaple :
0/TT>2B1)le trapendrdiffée cnc>
 
flocong//mot {rP>ebant
bants2oco) a,b,c,L;
a:=x;
d,e1,f,g,h,i1,kLL;
if (n==0)h;
v:=i*u;
Ly;
D+h)/2);hre:=c;

2,(hocc;
b2,(hocd:=c+hLe1;
buh;
f:=auh;
g:=fuh;
k:=e1uh;
i1;
duh;
o(x+3arc(a:=xp
rsegment(barc(c:=xp
rsegment(barc(dx;
p
rsegment(barc(e1,d
p
rsegment(barc(e1,f
p
rsegment(barc(f,g,p
rsegment(barc(g,kLp
rsegment(barc(i1,kLp
rsegm
}:;

d cIangle mot {rP>ebant un2oco) h,L; h:=(B-aLL; if (n==0)h; v:=i*u; Ly; D+h)/2);hre:=o(x+3arc(a; L:=p rsegment(bbants2oco)gm }:;

d R>cIangle mot {rP>ebant 3>ux2oco) h,L; h:=(B-aLL; if (n==0)h; v:=i*u; Ly; D+h)/2);hre:=o(x+3arc(a,a; >

dioéano f le carre ABCIMasbutapxempoe mot {run> d'1/TT>2B1) n d'a commanbantsn de "uB 2 1/ococal u,v,L; u:a,h==0) {return isopolygoun2oco)g} if (n==0)h; v:=i*u; Ly; D+hano(x+31/ocaLL,peano(x+32{ 2,(hcaLL,peano(x+31(sqrL:=L,peano(y+v,y+2*1v:+i*h1); r L:=L,carre8p(A1(sqr; r L:=a; r L:=L,carre8p(A2{ 2,(hca; r L:=L,carre8p(A2{x; r L:=a; r L:=L,carre8p(A2{ 23r L:=a; r L:=L,carre8p(A1(sqr; r L:=); r L:=L,carr }:;

dioéano f le carre ABCIMasbutapxempoe mot {r "uB> d'2/TT>2B1) n d'a commanbantsn de "uB 1 2{xcocal u,v,L; u:a,h==0) {return isopolygo3>ux2oco)g} if (n==0h; v:=i*u; Ly; D+hano(x+32/ocaLL,peano(x+32{ 2,(hcaLL,peano(x+31(sqrL:=L,peano(y+v,y+2*1v:+i*h1); r L:=L,carre8p(A1(sqr; r L:=a; r L:=L,carre8p(A2{ 2,(hca; r L:=L,carre8p(A2{x; r L:=a; r L:=L,carre8p(A2{ 23r L:=a; r L:=L,carre8p(A1(sqr; r L:=); r L:=L,pean }:;

On tape :
polyserp8(/TT>0/TT>2B3) On obtient :
10P>

Vous po"4ubsection"><"><"> flocong//ioéano aunberg(2B2TT>
aunberd(2B2TT>
g//oe morceme 1 hilg( local u,v,L; u:=(y-a,b; for (j:=1 {return e,y+3*v);} Ll; }:;

On tape :programmsri se trouvee onosiaearré4 hexas, ppelun polenuctioéano carre8philg( local u,v,L; u:=(y-a,bLL; if (n==0) {return segment(A,B);} t:} Ll;})3; v:-i*u2 rv:=u*i; e8p(Ahild(); Leturn L;e8p(Ahilg( 1); L L:=L,peany; berg( L L:= L:=L,peane8p(Ata

doe morceme 2 hild();ocal u,v,L; u:=(y-a,bLL; if (n==0) {return segment(A,B);} t:} Ll;})3; v:-i*u2 rv:=u*i; e8p(Ahilg( lx-eturn L;e8p(Ahild()-et)-eL:=L,peanb; berd-)-eL:=xL:=L,peane8p(Ata

doe morceme 3 beag{ local u,v,L; u:=(y-bLL; if (n==0) {return segment(Ay,,B);} t:} Ll;})v; (x-y*usL;3; -v*i; e8p(Ahild(); Leturn L;e8p(Ahilg( 1); L L:=L,peanb; berg( L L:= L:=L,peane8p(Ata

doe morceme 4 bead( local u,v,L; u:=(y-aLL; if (n==0) {return segment(Ay,,B);} t:} Ll;})v; (x-y*usL;3; -v*i; e8p(Ahilg(); Leturn L;e8p(Ahild( 1); L -:=L,peany; berd( 1)-:=x-uturn L;e8p(Ata>

On tape :
Sierpinskhilg(-2< On On obtient :
10R> On partag :
polyserp(hilg(-2< OR> On obtient :
109>

<"> flocong//gosper(-2TT>On tape :
polyserp8gosper(-2TT> 110> On tape :
polyserp(gosper(-2TT>
On obtient :
111P>

<"> flocong//prograF=anIa

On tape :
a(0,1Ia 112> Pour compdprograF=anf1...6.o CLASS="verbatim"> flocong//prograF=anf1...6ar f1...(0,R*i) f1...(oco) h,L ,j,q,pL; if (n==0) {reabs(x-y*) return segment(A,B);} L:} Ll,s rcle(y,+:=i*;0.3l;}) ent(b,B);} L:} Ll,s rcle(y,+:=i*;0.3l,s rcle(y,+:=i*;0.2 L; ent(bf1...(oc+u+:=i*;0.5;(i*pi;0.5) L; ent(bf1...(oc+u+:=i*;0.5;(i*p-i;0.5) L;>

On tape :
a(0,1f1...(0,R*i) On obtient :
113> Pour compdprograF=anR>bP> .o CLASS="verbatim"> flocongR>bP>1(oco) h,L ,j,q,pL; if (n==0) {reabs(x-y*) retu1 segment(A,B);} L:} Ll;}) ent(b,B);} L:} (,yyL,segm o(x+3arbP>1(),yyL,sc),yyL,su+:=i*;0.5;(i*pi;0.5) L; ent(barbP>1(),yyL,sc),yyL,su+:=i*;0.5;(i*p-i;0.5) L; }:;

On tape :
a(0,1arbP>1(0,R*i) On obtient :
11R> Génetnles R>bP> emtrment unlumois o CLASS="verbatim"> flocongR>bP>2(oco) h,L ,j,q,pL; if (n==0) {reabs(x-y*) retu1 segment(A,B);} L:} Ll;}) ent(b,B);} L:} (,yyL,segm o(x+3arbP>2(),yyL,sc),yyL,su+:=i*;0.5;(i*pi;0.5) L; ent(barbP>2(),yyL,sc),yyL,su+:=i*;0.5;(i*p-i;0.5) L; ent(barbP>2(),yyL,sc),yyL,su+:=i*;0.5;(i*pi) L; ent(barbP>2(),yyL,sc),yyL,su+:=i*;0.5;(i*p-i) L; }:;

On tape :
a(0,1arbP>2(0,R*i) On obtient :
115> Génetnun euxI> CLASS="verbatim"> flocongR>bP>3(oco) h,L ,j,q,pL; if (n==0) {reabs(x-y*) retu1 segment(A,B);} L:} Ll;}) ent(b,B);} L:} (,yyL;0.5)L; ent(barbP>3((3*x+y/24c(3*x+y/24u+:=i*;0.25;(i*pi;0.5) L; ent(barbP>3((3*x+y/24c(3*x+y/24u+:=i*;0.25;(i*p-i;0.5) L; ent(barbP>3(),yyL,sc),yyL,su+:=i*;0.5;(i*pi) L; ent(barbP>3(),yyL,sc),yyL,su+:=i*;0.5;(i*p-i) L; }:;

On tape :
a(0,1arbP>3(0,R*i) On obtient :
11R> AutrG SRCprograF=anfougtrap6.o CLASS="verbatim"> flocong// re

dle :

On tape :
a(0,1 117> On tape :
a(0,1 118> RemarqEirenfin,n squetnfin u:o CLASS="verbatim"> flocong//etn squetnfin u:T>squet(0,R*i) T>squet(oco) h,L ,j,q,pL; if (n==0) {reabs(x-y*) retu1 segment(A,B);} L:} Ll;}) ent(b,B);} L:} (,yyL;0.5)L; ent(bT>squet((3*x+y/24c(3*x+y/24u+:=i*;0.25;(i*pi;0.5) L; ent(bT>squet((3*x+y/24c(3*x+y/24u+:=i*;0.25;(i*p-i;0.5) L; ent(bT>squet((,yyL,sc),yyL,su+:=i*;0.5;(i*pi) L; ent(bT>squet((,yyL,sc),yyL,su+:=i*;0.5;(i*p-i) L; ent(bT>squet((,yyL,sc),yyL,su+:=i*;0.5 L; }:;

On tape :
a(0,1T>squet(0,R*i) On obtient :
119P>

10tp://www-Bernrd Pe issee na..png"><09.htmlB>Rcasgeo098previous_mot {.gif" ALT="PreviousNAME="C"A HREF">index.htmlB>Rcasgeo098allaessi_mot {.gif" ALT="UpNAME="C"A HREF">.png"><11PhtmlB>Rcasgeo098next_mot {.gif" ALT="NextNAME="C"/BODY"C"/HTML>

//ioéano f le carre ABCIMasbutapxempoe mot {rbants> d'0/TT>2B1) aun 0/TT>2B3) in d'a commanbantsn de "uB 1 2 0/ococal u,v,L; u:a,h==0) {return isopolygobants2oco)g} if (n==0)h; v:=i*u; Ly; D+hano(x+30/ocaLL,peano(x+32{ 2,(hcaLL,peano(x+31(sqrL:=L,peano(y+v,y+2*1v:+i*h1); r L:=L,carre8p(A1(sqr; r L:=a; r L:=L,carre8p(A2{ 2,(hca; r L:=L,carre8p(A2{x; r L:=a; r L:=L,carre8p(A2{ 23r L:=a; r L:=L,carre8p(A1(sqr; r L:=); r L:=L,carr }:;