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. 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. 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