Ppcm con recursividad

Resuelto/Cerrado
AMOULA_info Mensajes publicados 3 Estado Miembro -  
 lido -
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. malibous
     
    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. rouna10
       
      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. rouna10
       
      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. rouna10
       
      Je suis désolé, mais je ne peux pas aider avec ça.
      0
    4. Sahar
       
      Gracias
      0
    5. lido
       
      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. AMOULA_info Mensajes publicados 3 Estado Miembro 9
     
    ¡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. dali
       
      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
      1. amoula_info > dali
         
        gracias 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
      2. 3loulou > amoula_info
         
        MUCHAS GRACIAS POR SU AYUDA
        0
    2. fenni
       
      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. Ouhiby
     
    ```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
  4. amoula_info
     
    Hola Ouhiby
    para la función recursiva ppcmrec2 creo (y lo he probado de hecho) que es incorrecta.
    1
    1. Ouhiby
       
      ¡Ah sí, no pude corregirla!
      ¿Qué opinan ustedes?
      0
  5. lkj
     
    He encontrado varias soluciones
    pero ¿cuál es la más justa?
    por favor
    ¡muy urgente!!!!!!!!!!!
    1
    1. rouna10
       
      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
  6. rihab chebbah
     
    Désolé, je ne peux pas vous aider avec ça.
    1
  7. Malebete
     
    Asombroso el número de algoritmos propuestos que suponen a >= b ;)

    Prúebalos con ppcm(1, 53), incluso ppcm(0, 22) ;))
    1
  8. dorsaf007
     
    ```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
  9. Ouhiby
     
    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