La récursivité
4 participants
Page 1 sur 1
La récursivité
Voici les exercices interessants que j'ai trouvés sur Internet
Exercice : Fonction Ackerman
Ecrire la spécification, déduire l’algorithme et déclarer les objets d’un module récursif permettant de calculer la fonction Ackerman définie par :
A (0, n) = n+1,
A (m, 0) = A (m-1, 1)
A (m, n) = A (m-1, A(m, n-1))
Exercice :
Ecrire la spécification, déduire l’algorithme et déclarer les objets d’un module récursif permettant de calculer le nombre d’occurrences d’un caractère dans une chaîne de caractères.
Exercice : Fonction Ackerman
Ecrire la spécification, déduire l’algorithme et déclarer les objets d’un module récursif permettant de calculer la fonction Ackerman définie par :
A (0, n) = n+1,
A (m, 0) = A (m-1, 1)
A (m, n) = A (m-1, A(m, n-1))
Exercice :
Ecrire la spécification, déduire l’algorithme et déclarer les objets d’un module récursif permettant de calculer le nombre d’occurrences d’un caractère dans une chaîne de caractères.
Hanafi- Messages : 106
Date d'inscription : 25/10/2008
Re: La récursivité
Bonjour tou le monde
voici la reponse
ex1
uses wincrt;
var m,n:integer;
function Ackerman(m,n:integer):integer;
begin
if m=0 then
Ackerman:=n+1
else
if n=0 then
Ackerman:=Ackerman(m-1,1)
else
Ackerman:=Ackerman(m-1,Ackerman(m, n-1));
end;
begin
write('Donner m = ' );readln(m);
write('Donner n = ' );readln(n);
writeln(Ackerman(m,n));end.
ex2
uses wincrt;
var
ch:string;
c:char;
function occ(ch:string;c:char):integer;
begin
if pos(c,ch)=0 then
occ:=0
else
begin
delete(ch,pos(c,ch),1);
occ:=1+occ(ch,c);
end;
end;
begin
write('Donner une chaïne = ');readln(ch);
write('Donner un caractère = ');readln(c);
if occ(ch,c)=0 then
write(ch,' ne contient pas ',c,'.')
else
write(ch,' contient ',occ(ch,c),' fois ',c,'.')
end.
voici la reponse
ex1
uses wincrt;
var m,n:integer;
function Ackerman(m,n:integer):integer;
begin
if m=0 then
Ackerman:=n+1
else
if n=0 then
Ackerman:=Ackerman(m-1,1)
else
Ackerman:=Ackerman(m-1,Ackerman(m, n-1));
end;
begin
write('Donner m = ' );readln(m);
write('Donner n = ' );readln(n);
writeln(Ackerman(m,n));end.
ex2
uses wincrt;
var
ch:string;
c:char;
function occ(ch:string;c:char):integer;
begin
if pos(c,ch)=0 then
occ:=0
else
begin
delete(ch,pos(c,ch),1);
occ:=1+occ(ch,c);
end;
end;
begin
write('Donner une chaïne = ');readln(ch);
write('Donner un caractère = ');readln(c);
if occ(ch,c)=0 then
write(ch,' ne contient pas ',c,'.')
else
write(ch,' contient ',occ(ch,c),' fois ',c,'.')
end.
Ilyes KHAILI- Messages : 24
Date d'inscription : 13/11/2008
Age : 34
Re: La récursivité
C'est très bien, Ilyes !!! Bravo. Merci pour le partage. Concernant le PPCM vous avez mille fois raison. Notre fonction marche que pour les petites valeurs. Et pourquoi ? Parce que on change la valeur de max par a ou bien par b a cause de ces instructions : SI a>b Alors max<--a, min<--b SINON max<--b, min<--a. C.à.d, même si on fait le calcul max <--max+(a+b-min) une fois la fonction retourne au début, elle trouve cette fameuse SI et elle affecte à max la valeur de a ou b. Essayez de la corriger.
Hanafi- Messages : 106
Date d'inscription : 25/10/2008
PPCM
A Ilyes :
Voici le programme de calcul PPCM qui fonctionne avec les grandes valeurs (enfin, pas si grandes, car le type LONGINT comprend l'intervalle [-2147483648..2147483647]
program calcul_ppcm;
uses wincrt;
var a,b,max,min:longint;
function ppcm(max,min:longint):longint;
begin
if max mod min=0 then
ppcm:=max
else
ppcm:=ppcm(max+(a+b-min),min);
end;
begin
repeat
write('Donner a ');
readln(a);
write('Donner b ');
readln(b);
until a*b<>0 ;
if a>b then
begin
max:=a;
min:=b;
end
else
begin
max:=b;
min:=a;
end;
writeln('ppcm=',ppcm(max,min));
end.
Vos commentaires S.V.P
Voici le programme de calcul PPCM qui fonctionne avec les grandes valeurs (enfin, pas si grandes, car le type LONGINT comprend l'intervalle [-2147483648..2147483647]
program calcul_ppcm;
uses wincrt;
var a,b,max,min:longint;
function ppcm(max,min:longint):longint;
begin
if max mod min=0 then
ppcm:=max
else
ppcm:=ppcm(max+(a+b-min),min);
end;
begin
repeat
write('Donner a ');
readln(a);
write('Donner b ');
readln(b);
until a*b<>0 ;
if a>b then
begin
max:=a;
min:=b;
end
else
begin
max:=b;
min:=a;
end;
writeln('ppcm=',ppcm(max,min));
end.
Vos commentaires S.V.P
Hanafi- Messages : 106
Date d'inscription : 25/10/2008
3 en 1
Exercice intéressant proposé par Mr Zarrouki Anis du Lycée OKBA de Kairouan pour le DS1 :
Écrire une analyse et un algorithme qui permet de calculer pour un ordre n donné (n>0), la somme approchée de la série définie par :
S=1 + 1/(5*1!) + 1/(25*2!) + ... + 1/(5n * n!)
NB : la solution proposée à cet exercice doit suivre un raisonnement récursif et non itératif.
J'attends vos solutions. ...
Écrire une analyse et un algorithme qui permet de calculer pour un ordre n donné (n>0), la somme approchée de la série définie par :
S=1 + 1/(5*1!) + 1/(25*2!) + ... + 1/(5n * n!)
NB : la solution proposée à cet exercice doit suivre un raisonnement récursif et non itératif.
J'attends vos solutions. ...
Hanafi- Messages : 106
Date d'inscription : 25/10/2008
Re: La récursivité
Toujours j'attends vos solutionsssssssssssssssssssss !!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hanafi- Messages : 106
Date d'inscription : 25/10/2008
Voila mon essai
uses wincrt;
var
n:integer;
function fact(n:integer):longint;
begin
if n=0 then
fact:=1
else
fact:=n*fact(n-1);
end;
function somme(n:integer):real;
begin
if n=0 then
somme:=1
else
somme:=1/(5*n*fact(n))+somme(n-1);
end;
begin
repeat
write('Donner un entier positif n = ');readln(n);
until n>0;
writeln('La somme S = ',somme(n):2:10);
end.
var
n:integer;
function fact(n:integer):longint;
begin
if n=0 then
fact:=1
else
fact:=n*fact(n-1);
end;
function somme(n:integer):real;
begin
if n=0 then
somme:=1
else
somme:=1/(5*n*fact(n))+somme(n-1);
end;
begin
repeat
write('Donner un entier positif n = ');readln(n);
until n>0;
writeln('La somme S = ',somme(n):2:10);
end.
Mohamedh hafedh bellil- Messages : 7
Date d'inscription : 24/10/2008
Re: La récursivité
C'est bien, Hafedh, juste une petite remarque : il faut calculer 5n et pas 5*n. C'est mieux d'ajouter une fonction puissance ...
Bonne continuation
Bonne continuation
Hanafi- Messages : 106
Date d'inscription : 25/10/2008
Voila madam
function puiss(n:integer):longint;
begin
if n=0 then
puiss:=1
else
puiss:=5*puiss(n-1);
end;
et modifier la ligne somme:=1/(5*n*fact(n))+somme(n-1); par somme:=1/(puiss(n)*fact(n))+somme(n-1);
begin
if n=0 then
puiss:=1
else
puiss:=5*puiss(n-1);
end;
et modifier la ligne somme:=1/(5*n*fact(n))+somme(n-1); par somme:=1/(puiss(n)*fact(n))+somme(n-1);
Mohamedh hafedh bellil- Messages : 7
Date d'inscription : 24/10/2008
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|