pascal汉诺塔程序解释

来源:百度知道 编辑:UC知道 时间:2024/09/20 17:47:51
原程序如下:var
total:integer;
procedure move(n,a,b,c:integer);
begin
if n=1
then writeln(a,c)
else begin
move(n-1,a,c,b);
writeln(a,c);
move(n-1,b,a,c);
end;
end;
begin
read(total);
move(total,1,2,3);
end.
请分层次解释,还有疑问:move(n-1,a,c,b);和procedure move(n,a,b,c:integer中a\b\c是不是一样,如果一样,那writeln(a,c)只能有一中输出即1 3
其实就是具体参数是如何变化,难道a不是一直等于1吗

不是
这是实际参数表和形式参数表的问题

调用函数时输入的参数是实际参数
你这里用的是值参数
实际参数将值传给形式参数
由形式参数在函数内部代替实际参数执行运算
当函数中的形式参数与主程序中的某个变量重名时
在该函数中的该变量标识符代表形式参数,主程序中的变量无效
也就是说
主程序中的变量的作用范围:
整个程序 “减” 含有与该变量同名的变量或形式参数的函数

在你的程序中
由于过程的递归
会出现很多的“a”
读入的total有多大
就有多少个“a”
虽然都是a
但程序运行的时候
把他们当作不同的变量来处理
程序每递归调用一次
就会创建一个新的a
原来的a暂时无效
等递归的过程运行完了后
原来的a才重新有效

而本次递归的当前a的真实值还是要看实际参数与形式参数的一一对应
如:
这次调用
move(n-1,b,a,c);

由于过程是这样定义的
procedure move(n,a,b,c:integer);
所以主过程中的 b {move(n-1,b,a,c)(这里的b)}; 的值传给了
子过程中的a {procedure move(n,a,b,c:integer); (这里的a)}
在子过程运行时
a携带着原来b的值参与运算
直到该子过程运行结束

有点罗嗦
自己找点参数的资料看看吧