duda recursividad pascal
Publicado por kamsky (10 intervenciones) el 08/04/2006 22:29:05
hola, mi problema es el siguiente:
tengo que hacer un program, en el que implemento un TAD polinomio, cuya declaracion es la siguiente:
TYPE
Tpolinomio = ^polinom;
polinom = RECORD
grado:integer;
coeficiente:real;
sig:Tpolinomio;
end;
y las siguientes operaciones:
procedure polinomiovacio(var p:Tpolinomio);
procedure insertarcampo(var pol:Tpolinomio;gradopol:integer;coefpol:real);
procedure crear(var p:Tpolinomio);
procedure imprimir(p:Tpolinomio);
procedure sumar(p1,p2:Tpolinomio; var p3:Tpolinomio);
function evaluar(p:Tpolinomio; x:real):Real;
{procedure multiplicar(p1,p2:Tpolinomio; var p3:Tpolinomio); }
procedure liberarmemoria(p:Tpolinomio);
me va todo bien ,excepto el de sumar, que lo tengo que hacer recursivamente y me da fallos... el codigo que utilice para este proc es el siguiente:
procedure sumar(p1,p2:Tpolinomio; var p3:Tpolinomio);
var
p3inicio,p3igual,p3aux:Tpolinomio;
igual:boolean;
begin
writeln('inicio');
if (p1<>nil) or (p2<>nil) then
begin
writeln('p1 y p2 <> nil');
if p1<>nil then
begin
writeln('p1 <> nil');
if p3<> nil then
begin
p3inicio:= p3;
writeln('p3inicio = p3');
writeln('-------p3<>nil');
igual:=false;
repeat
igual:=((p1^.grado) = (p3^.grado));
p3igual:=p3;
p3:= p3^.sig;
until igual or (p3=nil) ;
if igual then
begin
p3:= p3igual;
p3^.grado:= p1^.grado;
p3^.coeficiente:= p1^.coeficiente + p3^.coeficiente;
p3^.sig:= p3^.sig;
end
else
begin
p3:=p3inicio;
while p1^.grado > p3^.grado do
p3:=p3^.sig;
p3aux:=p3;
new(p3);
p3^.grado := p1^.grado;
p3^.coeficiente:= p1^.coeficiente;
p3^.sig:= p3aux;
end;
end
else
begin
writeln('p3 = nil');
p3aux:=p3;
writeln('p3aux= p3');
new (p3);
p3^.grado := p1^.grado;
p3^.coeficiente:= p1^.coeficiente;
p3^.sig:= p3aux;
p3inicio:= p3aux;
writeln('p3inicio 0 p3');
end;
p1:=p1^.sig;
writeln('paso p1 al sig');
end;
if p2<>nil then
begin
writeln('dentro p2<>nil');
p3:= p3inicio;
writeln('p3 = p3inicio');
igual:=false;
repeat
writeln('dentro repeat');
writeln('igual antes = ', igual);
igual:= ((p2^.grado) = (p3^.grado));
writeln('igual = ',igual);
p3igual:= p3;
p3:=p3^.sig;
until (igual= true) or (p3= nil);
writeln('fuera repat');
if igual then
begin
writeln('igual = true');
p3:=p3igual;
p3^.grado:= p2^.grado;
p3^.coeficiente:= p2^.coeficiente + p3^.coeficiente;
p3^.sig:= p3^.sig;
writeln('fin igual');
end
else
begin
p3:= p3inicio;
while p2^.grado > p3^.grado do
p3:=p3^.sig;
p3aux:=p3;
new(p3);
p3^.grado := p2^.grado;
p3^.coeficiente:= p2^.coeficiente;
p3^.sig:= p3aux;
end;
p2:=p2^.sig;
end;
p3:=p3inicio;
sumar(p1,p2,p3);
end;
end;
me da un error en los repeat, al darle el valor de igual, y no consigo saber porque es.... les ruego me ayuden, o si creen que este procedimiento se podria implementar de otra forma mas simple (siempre que sea recursivo), me sugieran, muchas gracias...
buen por si acaso les explico lo que hago en ese proc.:
me pasan 2 polinomios, que debo sumar, compruebo que al menos uno de los 2 no se haya recorrido completamente, si es asi, cojo el 1ero, si P3 (el polinomio resultante), no esta vacio, lo recorro para ver si hay algun registro en el k koincida el grado, si es asi, sumo los coeficientes, si no, recorro el P3 para situar en el sitio correcto el registro del P1.... si le p3 es vacio(cosa que solo ocurre una vez), pongo el registro de p1 en p3 directamente... acontinuacion hago lo mismo con el P2, al final pongo el p3 en su primer registro, y avanzo en uno los valores de P1 y P2 y vuelvo a llamar al procedimiento...
muchas gracias de antemano
tengo que hacer un program, en el que implemento un TAD polinomio, cuya declaracion es la siguiente:
TYPE
Tpolinomio = ^polinom;
polinom = RECORD
grado:integer;
coeficiente:real;
sig:Tpolinomio;
end;
y las siguientes operaciones:
procedure polinomiovacio(var p:Tpolinomio);
procedure insertarcampo(var pol:Tpolinomio;gradopol:integer;coefpol:real);
procedure crear(var p:Tpolinomio);
procedure imprimir(p:Tpolinomio);
procedure sumar(p1,p2:Tpolinomio; var p3:Tpolinomio);
function evaluar(p:Tpolinomio; x:real):Real;
{procedure multiplicar(p1,p2:Tpolinomio; var p3:Tpolinomio); }
procedure liberarmemoria(p:Tpolinomio);
me va todo bien ,excepto el de sumar, que lo tengo que hacer recursivamente y me da fallos... el codigo que utilice para este proc es el siguiente:
procedure sumar(p1,p2:Tpolinomio; var p3:Tpolinomio);
var
p3inicio,p3igual,p3aux:Tpolinomio;
igual:boolean;
begin
writeln('inicio');
if (p1<>nil) or (p2<>nil) then
begin
writeln('p1 y p2 <> nil');
if p1<>nil then
begin
writeln('p1 <> nil');
if p3<> nil then
begin
p3inicio:= p3;
writeln('p3inicio = p3');
writeln('-------p3<>nil');
igual:=false;
repeat
igual:=((p1^.grado) = (p3^.grado));
p3igual:=p3;
p3:= p3^.sig;
until igual or (p3=nil) ;
if igual then
begin
p3:= p3igual;
p3^.grado:= p1^.grado;
p3^.coeficiente:= p1^.coeficiente + p3^.coeficiente;
p3^.sig:= p3^.sig;
end
else
begin
p3:=p3inicio;
while p1^.grado > p3^.grado do
p3:=p3^.sig;
p3aux:=p3;
new(p3);
p3^.grado := p1^.grado;
p3^.coeficiente:= p1^.coeficiente;
p3^.sig:= p3aux;
end;
end
else
begin
writeln('p3 = nil');
p3aux:=p3;
writeln('p3aux= p3');
new (p3);
p3^.grado := p1^.grado;
p3^.coeficiente:= p1^.coeficiente;
p3^.sig:= p3aux;
p3inicio:= p3aux;
writeln('p3inicio 0 p3');
end;
p1:=p1^.sig;
writeln('paso p1 al sig');
end;
if p2<>nil then
begin
writeln('dentro p2<>nil');
p3:= p3inicio;
writeln('p3 = p3inicio');
igual:=false;
repeat
writeln('dentro repeat');
writeln('igual antes = ', igual);
igual:= ((p2^.grado) = (p3^.grado));
writeln('igual = ',igual);
p3igual:= p3;
p3:=p3^.sig;
until (igual= true) or (p3= nil);
writeln('fuera repat');
if igual then
begin
writeln('igual = true');
p3:=p3igual;
p3^.grado:= p2^.grado;
p3^.coeficiente:= p2^.coeficiente + p3^.coeficiente;
p3^.sig:= p3^.sig;
writeln('fin igual');
end
else
begin
p3:= p3inicio;
while p2^.grado > p3^.grado do
p3:=p3^.sig;
p3aux:=p3;
new(p3);
p3^.grado := p2^.grado;
p3^.coeficiente:= p2^.coeficiente;
p3^.sig:= p3aux;
end;
p2:=p2^.sig;
end;
p3:=p3inicio;
sumar(p1,p2,p3);
end;
end;
me da un error en los repeat, al darle el valor de igual, y no consigo saber porque es.... les ruego me ayuden, o si creen que este procedimiento se podria implementar de otra forma mas simple (siempre que sea recursivo), me sugieran, muchas gracias...
buen por si acaso les explico lo que hago en ese proc.:
me pasan 2 polinomios, que debo sumar, compruebo que al menos uno de los 2 no se haya recorrido completamente, si es asi, cojo el 1ero, si P3 (el polinomio resultante), no esta vacio, lo recorro para ver si hay algun registro en el k koincida el grado, si es asi, sumo los coeficientes, si no, recorro el P3 para situar en el sitio correcto el registro del P1.... si le p3 es vacio(cosa que solo ocurre una vez), pongo el registro de p1 en p3 directamente... acontinuacion hago lo mismo con el P2, al final pongo el p3 en su primer registro, y avanzo en uno los valores de P1 y P2 y vuelvo a llamar al procedimiento...
muchas gracias de antemano
Valora esta pregunta


0