Pascal/Turbo Pascal - duda recursividad pascal

 
Vista:

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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder