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

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

Prúebalos con ppcm(1, 53), incluso ppcm(0, 22) ;))
1
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
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