我在pascal(或delphi)中编写了一个递归的树函数,但是当我运行它时,我有一个“Out of Memory”消息。 我需要将此代码中的Calculate递归函数转换为非递归函数,你能告诉我怎么样:
program testing(input,output);
type
ptr = ^tr;
tr = record
age:byte;
left,right:ptr;
end;
var
topper:ptr;
total,day:longint;
procedure mycreate(var t:ptr);
var temp:ptr;
begin
new(temp);
temp^.age:=1;
temp^.left:=nil;
temp^.right:=nil;
t:=temp;
end;
procedure gooneday(var t:ptr);
begin
if t^.age<>5 then
begin
if t^.age=2 then
mycreate(t^.left)
else if t^.age=3 then
mycreate(t^.right);
t^.age:=t^.age+1;
total:=total+1;
end;
end;
procedure calculate(var crnt:ptr);
begin
if crnt<>nil then
begin
gooneday(crnt);
calculate(crnt^.left);
calculate(crnt^.right);
end;
end;
begin
total:=0;
mycreate(topper);
day:=0;
while total<1000000000000 do
begin
total:=0;
day:=day+1;
calculate(topper);
end;
writeln(day);
writeln(total);
end.
答案 0 :(得分:4)
递归函数使用堆栈来保持递归的状态。
转换为循环时,必须实际创建显式堆栈。您必须在循环内从堆栈中推送和弹出元素。
答案 1 :(得分:2)
您可以在恒定的空间中遍历树。你可以在this disscussion看到。