关于递归算法,请大家帮我看看解释一下.在线等啊 谢谢了(100分)

  • 主题发起人 主题发起人 softlong
  • 开始时间 开始时间
S

softlong

Unregistered / Unconfirmed
GUEST, unregistred user!
1、 procedure TForm1.Button1Click(Sender: TObject);
var a:byte;
procedure Num(x:integer);
begin
if x=5 then
a:=10
else
begin
Num(x+1);
//ShowMessage(vartostr(a));
a:=a+2;
end;
end;
begin
Num(1);
ShowMessage(vartostr(a));
end;


2.
procedure TForm1.Button1Click(Sender: TObject);
var a:byte;
procedure Num(x:integer);
begin
if x=5 then
a:=10
else
begin
Num(x+1);
ShowMessage(vartostr(a));
a:=a+2;
end;
end;
begin
Num(1);
ShowMessage(vartostr(a));
end;

单步执行时,你可以看出,当x=5时,
代码1是执行完a:=10之后,紧接着执行
a:=a+2,
而第二段代码,当x=5时,执行完a:=10之后直接
跳到执行到end;然后才返加到上次调用的下一条语句
继续执行
当达到边界条件时,也就是当x=5时,
两段代码的执行顺序为什么不同?
 
其实执行结果是完全一致的,
多了ShowMessage(vartostr(a))之后,就会执行end,退出本层递归,返回前一层再继续,
而没有ShowMessage(vartostr(a));,则编译优化,隐含执行本层的end;直接返回前一层,
因为是隐含执行,所以单步调试的时候,end忽略掉了,所以你看上去次序不同,但实际
忽略掉也无所谓。至于为什么有ShowMessage时就不优化,可能要调用api,免得出问题吧。
实际优化后的编译结果也不同
 
接受答案了.
 
后退
顶部