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. ```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. Asombroso el número de algoritmos propuestos que suponen a >= b ;)

      Prúebalos con ppcm(1, 53), incluso ppcm(0, 22) ;))
      1
      1. Désolé, je ne peux pas vous aider avec ça.
        1
        1. 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
        2. 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
        3. 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
          1. ```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. ¡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