Ppcm con recursividad

Resuelto/Cerrado
Bonjour,
Hola a todos
quiero saber cómo calcular el mcm(a,b) con el método recursivo en Pascal sin agregar otro parámetro en la cabeza de la función, sabiendo que conozco el método iterativo de dos maneras:
1er método:
function mcm(a,b: integer):integer;
var i :integer;
begin
i:=1;
if a*b = 0 then mcm :=0 else
begin
while a*i mod b <> 0 do
i:=i+1;
mcm:=a*i;
end;
end;
2º método:
function mcm(a,b: integer):integer;
var max,min :integer;
begin
if a*b = 0 then mcm :=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);
mcm:=max;
end;
end;

gracias por tu ayuda
Configuración: Windows XP Internet Explorer 6.0

9 respuestas

  1. les presento la solución completa de todo el programa que calcula el mcm de dos enteros a y b utilizando el método recursivo, respetando las restricciones de entrada de a y b:

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

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

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

    var
    r:integer;

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

    begin
    ingresar(a,b);
    writeln('el mcm de ',a,' y ',b,' es ',mcm(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 ejecutas tu programa con enteros a y b (por ejemplo, a=23 y b=5) obtendrás un resultado incorrecto.
      Debes reemplazar "ppcm:=( a div r)* ppcm(b,r);" por "ppcm:=( a div r)* ppcm(a,r);"
      0
    3. Je suis désolé, mais je ne peux pas aider avec ça.
      0
    4. Gracias
      0
    5. el resultado es incorrecto... se debe reemplazar ppcm:=( a div r)* ppcm(b,r); por ppcm:= ppcm(b,r)*( a div r); y no es lo mismo
      0
  2. ¡Gracias a todos, encontré la solución por mí mismo!!!

    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. Hola
      con todo mi respeto hacia su punto de vista, respecto a esta solución (es una buena solución); pero le falta la prueba de división por cero :) es decir si el segundo parámetro es igual a cero entonces la solución es incorrecta (error en tiempo de ejecución) :) ¿de acuerdo?
      0
    2. @daligracias por su interés y sobre todo por su cortesía, pero basta con agregar otra prueba al principio para resolver este problema.
      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;
      mi verdadero problema era con los parámetros al hacer la nueva llamada a la función.
      y así es como encontré la solución.
      ppcm(a,b)* pgcd(a,b) = a*b {teorema matemático}
      por lo tanto, pgcd(a,b ) = (a*b) / ppcm(a,b)
      y dado que pgcd(a,b) = pgcd(b,r) {con r = a mod b} y pgcd (b,r) = (b*r)/ ppcm(b,r) {de acuerdo con el teorema anterior}
      se puede concluir que (a*b) / ppcm(a,b) = (b*r) / ppcm(b,r) de donde ppcm(a,b) =( (a*b)/ (b*r))*ppcm(b,r)
      = (a div r )*ppcm(b,r)
      espero haber sido claro.
      0
    3. Aquí hay una solución óptima :

      Función ppcm (a, b, r : entero) : entero;
      comienzo
      si (r mod b)=0
      entonces ppcm := r
      más ppcm := ppcm (a, b, r+a) ;
      fin;
      La llamada será : Writeln ('PPCM = ', ppcm(a,b,a));
      0
  3. ```html Función ppcmRec1 (a,b,i :integer):integer;
    inicio
    si a * b = 0 entonces
    ppcmR := 0
    más
    si a * i mod b = 0 entonces
    ppcmR := a * i
    más
    ppcmR := ppcmR(a,b,i+1);
    Fin;

    Llamar X :=ppcmRec1(a,b,1) ```
    1
    1. Hola Ouhiby
      para la función recursiva ppcmrec2 creo (y lo he probado de hecho) que es incorrecta.
      1
      1. ¡Ah sí, no pude corregirla!
        ¿Qué opinan ustedes?
        0
    2. He encontrado varias soluciones
      pero ¿cuál es la más justa?
      por favor
      ¡muy urgente!!!!!!!!!!!
      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;

        { es la más justa}
        0
    3. Désolé, je ne peux pas vous aider avec ça.
      1
      1. Asombroso el número de algoritmos propuestos que suponen a >= b ;)

        Prúebalos con ppcm(1, 53), incluso ppcm(0, 22) ;))
        1
        1. ```pascal
          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. Lo siento, he cometido errores en la llamada :)
            Aquí está la solución completa InChalah

            Programa testppcm;
            usos wincrt;

            función ppcm1(a,b: entero):entero;
            var i :entero;
            comienzo
            i:=1;
            si a*b = 0 entonces
            ppcm1 :=0
            más
            comienzo
            mientras a*i mod b <> 0 haz
            i:=i+1;
            ppcm1:=a*i;
            fin;
            fin;

            Función ppcmRec1 (a,b,i :entero):entero;
            comienzo
            si a * b = 0 entonces
            ppcmRec1 := 0
            más
            si a * i mod b = 0 entonces
            ppcmRec1 := a * i
            más
            ppcmRec1 := ppcmRec1(a,b,i+1);
            Fin;

            función ppcm2(a,b: entero):entero;
            var max,min :entero;
            comienzo
            si a*b = 0 entonces
            ppcm2 :=0
            más
            comienzo
            si a>b entonces
            comienzo
            max :=a;
            min:=b ;
            fin
            más
            comienzo
            max :=b;
            min :=a;
            fin;
            mientras max mod min <> 0 haz
            max := max +(a+b-min);
            ppcm2:=max;
            fin;
            fin;

            función ppcmRec2(a,b: entero):entero;
            Var
            max,min : entero;
            Comienzo

            si a*b = 0 entonces
            ppcmRec2 :=0
            más
            comienzo
            si a>b entonces
            comienzo
            max :=a;
            min:=b ;
            fin
            más
            comienzo
            max :=b;
            min :=a;
            fin;
            si max mod min = 0 entonces
            ppcmRec2:=max
            más
            ppcmRec2 := ppcmRec2(max +(a+b-min),b);

            fin;

            Fin;

            Comienzo
            {ejemplo de llamada}
            Writeln(ppcm1(15,3));
            Writeln(ppcmRec1(3,15,1));
            Writeln(ppcm2(4,12));
            Writeln(ppcmRec2(23,42));

            {
            Resultado :
            15
            15
            12
            84
            }
            Fin.
            0