Ppcm con recursividad
Resuelto/Cerrado
AMOULA_info
Mensajes publicados
3
Estado
Miembro
-
lido -
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
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
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.
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.
¡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;
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;
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.
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.
```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) ```
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) ```
Asombroso el número de algoritmos propuestos que suponen a >= b ;)
Prúebalos con ppcm(1, 53), incluso ppcm(0, 22) ;))
Prúebalos con ppcm(1, 53), incluso ppcm(0, 22) ;))
```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;
```
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;
```
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.
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.
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;
Debes reemplazar "ppcm:=( a div r)* ppcm(b,r);" por "ppcm:=( a div r)* ppcm(a,r);"