Les solutions proposées sont loin d'être les seules. Vous avez vu par exemple sept méthodes pour calculer 7!, et il en existe d'autres. Et puis, les solutions proposées ne sont pas forcément les meilleures : n'hésitez pas à faire part de vos idées.
Exercice 1
E:=proc(x) begin
local n;
n:=0;
while n<x do n:=n+1 end_while: n-1;
end_proc:
Exercice 2
ab:=proc(x) begin
if x>=0 then x else -x end_if;
end_proc:
Exercice 3
moy:=proc(l)
local s,k; begin
s:=0;
for k from 1 to nops(l) do s:=s+l[k] end_for: s/nops(l);
end_proc:
Notez qu'il faut rentrer une liste en argument, donc entre crochets. Vous remarquerez que nous sommes confrontés à un petit problème technique : nous avons plutôt l'habitude d'utiliser des approximations numériques pour les moyennes. Il existe pour cela la fonction float(nombre). Le nombre de chiffres par défaut est 10. On peut le faire varier grâce à la variable DIGITS:= nombre. Remarquez enfin que MuPAD fait la différence entre 1/3 et 1/3.0. Par exemple, comparez (1/3+2/3)-1 et 1/3+2/3.0)-1
Exercice 4
bn:=proc(n)
local a,b,k; begin
a:=1+1/n;
b:=1;
for k from 1 to n do b:=a^b end_for:
b
end_proc:
Le résultat est un peu illisible. On peut utiliser la fonction simplify(nombre), mais le résultat est un peu faiblard. Mieux vaut faire intervenir float dans la procédure.
Exercice 5
" ...le plus petit entier tel que..." nous fait penser à une boucle while
m:=1:
while bn(m)>1.001 do m:=m+1 end_while:
m;
Exercice 6
La ruse est d'introduire deux variables en plus de l'indice : t pour le terme et s pour la somme
S:=proc(n)
local s,t,k; begin
s:=1: t:=1:
for k from 1 to n do t:=t/k: s:=s+t
end_for:
s
end_proc:
Par curiosité, essayez
float(S(32)-exp(1));
Comment y remédier ?
Passons à la question suivante :
DIGITS=1000:
seuil:=proc(s)
local n; begin
n:=0:
while float(exp(1)-S(n))>float(1/10^s) do n:=n+1 end_while:
n;
end_proc:
Exercice 7
Rien de très difficile mathématiquement parlant, mais cela nous permet de découvrir la fonction elif, contraction de else if qui permet d'accéder à une sous-boucle if.
sol:=proc(a,b,c)
local d,x1,x2: begin
d:=b^2-4*a*c:
if d>0 then x1:=(-b-sqrt(d))/(2*a): x2:=(-b+sqrt(d))/(2*a):
elif d=0 then x1:=-b/(2*a): x2:=x1 :
else x1:=(-b-I*sqrt(-d))/(2*a): x2:=(-b+I*sqrt(-d))/(2*a) :
end_if;
if d<>0 then print("Les solutions sont ".expr2text(x1). "et " .expr2text(x2)):
else print ("La solution est ".expr2text(x1)):
end_if;
end_proc:
Il y a bien sûr plus court
solv:=proc(a,b,c) begin
solve(a*x^2+b*x+c=0,x);
end_proc: