testfor1(a,b):={
local j,s:=0;
for (j:=a;j<=b;j++)
s:=s+1/j^2;
return s;
};
ou
testpour1(a,b):={
local j,s:=0;
pour j de a jusque b faire
s:=s+1/j^2;
fpour;
return s;
};
Si a>b, l'instruction ou le bloc d'instructions du for ou du
pour ne se fera pas et la fonction retournera 0,
testfor2(a,b):={
local j,s:=0;
for (j:=b;j>=a;j--)
s:=s+1/j^2;
return s;
};
ou
testpour2(a,b):={
local j,s:=0;
pour j de b jusque a pas -1 faire
s:=s+1/j^2;
fpour;
return s;
};
Dans ce cas, si a<=b la variable j va prendre successivement les
valeurs b, b-1,...a (on dit que le pas est de -1) et pour chacune
de ces valeurs l'instruction ou le bloc d'instructions qui suit sera
exécuté. Par exemple testfor2(1,2) renverra 1/4+1=5/4.
testfor3(a,b):={
local j,s:=0;
for (j:=a;j<=b;j:=j+3)
s:=s+1/j^2;
return s;
};
ou
testpour3(a,b):={
local j,s:=0;
pour j de a jusque b pas 3 faire
s:=s+1/j^2;
fpour;
return s;
};
Dans ce cas, si a<=b la variable j va prendre successivement les
valeurs a, a+3,...a+3k avec k le quotient de b-a par 3
(3k<=b-a<3(k+1)) (on dit que le pas est de 3) et pour chacune
de ces valeurs l'instruction ou le bloc d'instructions qui suit sera
exécuté. Par exemple testfor3(1,5) renverra 1+1/16=17/16.
testwhile(a,b):={
while (a==10 or a<b)
b:=b-a;
return [a,b];
};
ou
testtantque(a,b):={
tantque a==10 or a<b faire
b:=b-a;
ftantque;
return [a,b];
};
Un exemple : le PGCD d'entiers
- Version itérative
pgcd(a,b):={
local r;
while (b!=0) {
r:=irem(a,b);
a:=b;
b:=r;
}
return a;
};
ou
pgcd(a,b):={
local r;
tantque b!=0 faire
r:=irem(a,b);
a:=b;
b:=r;
ftantque;
return a;
};
-Version récursive
pgcdr(a,b):={
if (b==0) return a;
return pgcdr(b,irem(a,b));
};
ou
pgcdr(a,b):=if (b==0) return a;
else return pgcdr(b,irem(a,b));
f():={
local a;
repeat saisir("entrez un reel entre 1 et 10",a); until a>=1 && a<=10;
return a;
}
ou
f():={
local a;
repeter saisir("entrez un reel entre 1 et 10",a); jusqua a>=1 et a<=10;
return a;
}
Voici la fonction qui renvoie un point fixe de f en utilisant
repeat. Cette fonction donne la solution à eps
près de f(x)=x en utilisant au plus n itérations et x0
comme début de l'itération donné par le théorème du point fixe.
point_fixe(f,n,x0,eps):={
local j,x1,x00;
j:=0;
repeat
x1:=evalf(f(x0));
j:=j+1;
x00:=x0;
x0:=x1;
until (abs(x00-x0)<eps) or (j>=n);
return j,x0;
}:;
ou
point_fixe(f,n,x0,eps):={
local j,x1,x00;
j:=0;
repeter
x1:=evalf(f(x0));
j:=j+1;
x00:=x0;
x0:=x1;
jusqua (abs(x00-x0)<eps) or (j>=n);
return j,x0;
}:;
point_fixe(f,n,x0,eps):={
local j,x1;
j:=0;
do
x1:=evalf(f(x0));
if (abs(x1-x0)<eps) return x1;
x0:=x1;
j:=j+1;
if (j>=n) break;
od;
return "non trouve au bout de ", n," iterations";
}:;
ou en utilisant faire
point_fixe(f,n,x0,eps):={
local j,x1;
j:=0;
faire
x1:=evalf(f(x0));
if (abs(x1-x0)<eps) return x1;
x0:=x1;
j:=j+1;
if (j>=n) break;
ffaire;
return "non trouve au bout de ", n," iterations";
}:;
On peut aussi écrire cela avec un for
point_fixe(f,n,x0,eps):={
local j,x1;
for (j:=0;j<n;j++){
x1:=evalf(f(x0));
if (abs(x1-x0)<eps) return x1;
x0:=x1;
}
return "non trouve au bout de ", n," iteration";
}:;
point_fixe(x->cos(x),100,1.0,1e-12)=0.739085133215
pgcd(a,b):={
local r;
for (;b!=0;) {
r:=irem(a,b);
a:=b;
b:=r;
}
return a;
}
:;
ou
pgcd(a,b):={
local r;
for (;;) {
if (b==0) break;
r:=irem(a,b);
a:=b;
b:=r;
}
return a;
}
:;