Ppcm avec recursivité

Résolu/Fermé
Bonjour,
Bonjour, tout le monde
je veux bien savoir comment calculer le ppcm(a,b) avec la methode recursive en pascal sans l'ajout d'un autre parametre à l'entête de la fonction sachant que je connais la methode itérative avec deux façons:
1ere methode:
function ppcm(a,b: integer):integer;
var i :integer;
begin
i:=1;
if a*b = 0 then ppcm :=0 else
begin
while a*i mod b <> 0 do
i:=i+1;
ppcm:=a*i;
end;
end;
2ème methode:
function ppcm(a,b: integer):integer;
var max,min :integer;
begin
if a*b = 0 then ppcm :=0 else
begin
if a>b then begin max :=a; min:=b ; end
else begin max :=b; min :=a; end;
while max mod min <> 0 do
max := max +(a+b-min);
ppcm:=max;
end;
end;

merci pour votre aide
Configuration: Windows XP
Internet Explorer 6.0

9 réponses

  1. je vous présente la solution complète de tout le programme qui fait le calcul du ppcm de deux entiers a et b avec la méthode récursive en respectant les contraintes de la saisie de a et b:

    program ppcm_rec;
    uses wincrt;
    var
    a,b:word;

    procedure saisir(var a,b:word);
    begin
    repeat
    writeln('donner a: ');
    readln(a);
    writeln('donner b: ');
    readln(b);
    until ((a>b) and (a>0));
    end;

    function ppcm(a,b:word): longint;

    var
    r:integer;

    begin
    if (b = 0) then
    ppcm := 0
    else if (a mod b = 0) then
    ppcm := a
    else
    begin
    r:=a mod b;
    ppcm:=( a div r)* ppcm(b,r);
    end;
    end;

    begin
    saisir(a,b);
    writeln('le ppcm de ',a,' et ',b,' est ',ppcm(a,b));
    end.
    8
    1. function ppcm(a,b:word): longint;

      var
      r:integer;

      begin
      if (b = 0) then
      ppcm := 0
      else if (a mod b = 0) then
      ppcm := a
      else
      ppcm:=( a div (a mod b))* ppcm(a,a mod b);
      end;
      0
    2. Si vous exécuter votre programme avec des entier a et b (par exemple a=23 et b=5) vous avez trouvé une fausse résultat.
      Il faut remplacé "ppcm:=( a div r)* ppcm(b,r);" par "ppcm:=( a div r)* ppcm(a,r);"
      0
    3. ecrire ce mm algo sans utiliser ni fonction, ni procédure
      0
    4. Merci
      0
    5. ce résultat est faux...il faut remplacer ppcm:=( a div r)* ppcm(b,r); par ppcm:= ppcm(b,r)*( a div r); et ce n'est pas la même chose
      0
  2. merci pour vous tous , j'ai trouvé la solution moi même!!!

    function ppcm(a,b:integer) : integer;
    var r : integer;
    begin

    if a mod b = 0 then ppcm := a

    else

    begin
    r:=a mod b;
    ppcm:=( a div r)* ppcm(b,r);
    end;

    end;
    1
    1. salut
      avec tous mes respects à votre point de vue , concernant cette solution (c'est une bonne solution); mais elle manque le test de division par zero :) c-a-d si le 2 eme parametre est egale à zero alors la solution est incorrecte (run time erreur) :) . ok ?
      0
    2. @dalimerci pour votre interêt et surtout pour votre politesse mais il suffit d'ajouter un autre test au début pour resoudre ce probleme.
      function ppcm(a,b:integer) : integer;
      var r : integer;
      begin

      if b = 0 then ppcm := 0
      else if a mod b = 0 then ppcm := a

      else

      begin
      r:=a mod b;
      ppcm:=( a div r)* ppcm(b,r);
      end;

      end;
      mon vrai problème etait avec parametres faire le nouvel appel de la fonction.
      et voilà comment j'ai trouvé la solution .
      ppcm(a,b)* pgcd(a,b) = a*b {theoreme mathématique}
      d'où pgcd(a,b ) = (a*b) / ppcm(a,b)
      et puisque pgcd(a,b) = pgcd(b,r) {avec r = a mod b} et pgcd (b,r) = (b*r)/ ppcm(b,r) {} d'aprés le théoreme precdedent}
      on peut conclure que (a*b) / ppcm(a,b) = (b*r) / ppcm(b,r) d'où ppcm(a,b) =( (a*b)/ (b*r))*ppcm(b,r)
      = (a div r )*ppcm(b,r)
      j'espère que j'etais bien claire
      0
    3. Voici une solution optimale :

      Function ppcm (a, b, r : integer) : integer;
      begin
      if (r mod b)=0
      then ppcm := r
      else ppcm := ppcm (a, b, r+a) ;
      end;
      L’appel sera : Writeln ('PPCM = ', ppcm(a,b,a));
      0
  3. Function ppcmRec1 (a,b,i :integer):integer;
    begin
    if a * b = 0 then
    ppcmR := 0
    else
    if a * i mod b = 0 then
    ppcmR := a * i
    else
    ppcmR := ppcmR(a,b,i+1);
    End;

    Appeler X :=ppcmRec1(a,b,1)
    1
    1. salut Ouhiby
      pour la fonction recursive ppcmrec2 je pense ( et je l'ai tester d'ailleur) qu'elle est fausse.
      1
      1. Ah oui, j'ai pas pu la corrigé !!!
        qu'est ce que vous en dites ?
        0
    2. j' ai trouver plusieur solution
      mais la quel la plus juste
      svp
      trés urgent!!!!!!!!!!!
      1
      1. function ppcm(a,b:word): longint;

        var
        r:integer;

        begin
        if (b = 0) then
        ppcm := 0
        else if (a mod b = 0) then
        ppcm := a
        else
        ppcm:=( a div (a mod b))* ppcm(a,a mod b);
        end;

        { c'est la plus just}
        0
    3. salut, SVP j ve un programme qui permet de saisir et d'afficher le ppcm de deux nombre ( le ppcm doit etre sous la formes des entier avec ses exposon!!) compris!! svp i need it
      1
      1. Etonnant le nombre d'algorithmes proposés qui supposent a >= b ;)

        Testez-les avec ppcm(1, 53), voire ppcm(0, 22) ;))
        1
        1. Function ppcm (a,b:integer):integer;
          begin
          if a=b then ppcm:=a
          else if a>b
          then ppcm:=(ppcm(a-b,b)*a) div (a-b)
          else ppcm:=(ppcm(a,b-a)*b) div (b-a);
          end;
          1
          1. Pardon j'ai commis des erreurs d'appel :)
            Voici la solution complète InChaallah

            Program testppcm ;
            uses wincrt;

            function ppcm1(a,b: integer):integer;
            var i :integer;
            begin
            i:=1;
            if a*b = 0 then
            ppcm1 :=0
            else
            begin
            while a*i mod b <> 0 do
            i:=i+1;
            ppcm1:=a*i;
            end;
            end;

            Function ppcmRec1 (a,b,i :integer):integer;
            begin
            if a * b = 0 then
            ppcmRec1 := 0
            else
            if a * i mod b = 0 then
            ppcmRec1 := a * i
            else
            ppcmRec1 := ppcmRec1(a,b,i+1);
            End;

            function ppcm2(a,b: integer):integer;
            var max,min :integer;
            begin
            if a*b = 0 then
            ppcm2 :=0
            else
            begin
            if a>b then
            begin
            max :=a;
            min:=b ;
            end
            else
            begin
            max :=b;
            min :=a;
            end;
            while max mod min <> 0 do
            max := max +(a+b-min);
            ppcm2:=max;
            end;
            end;

            function ppcmRec2(a,b: integer):integer;
            Var
            max,min : integer;
            Begin

            if a*b = 0 then
            ppcmRec2 :=0
            else
            begin
            if a>b then
            begin
            max :=a;
            min:=b ;
            end
            else
            begin
            max :=b;
            min :=a;
            end;
            if max mod min = 0 then
            ppcmRec2:=max
            else
            ppcmRec2 := ppcmRec2(max +(a+b-min),b);

            end;

            End;

            Begin
            {exemple d'aapel}
            Writeln(ppcm1(15,3));
            Writeln(ppcmRec1(3,15,1));
            Writeln(ppcm2(4,12));
            Writeln(ppcmRec2(23,42));

            {
            Résultat :
            15
            15
            12
            84
            }
            End.
            0