pascal 汉诺塔游戏

来源:百度知道 编辑:UC知道 时间:2024/06/05 15:08:42
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.
能否把整个递归过程帮我说一下
如:1.读取* 2.进入move过程 3.......

分析:这是一个非常好的递归程序设计示例。他不像前面的递归程序那样,先有非递归程序,再将其改写成递归形式。如果此题不使用递归过程或许就无从下手。下面我们先以三个金片为例:
要从杆A移动到杆B,要借助于杆C来过渡。移动方案是:
第一步 A-B
第二步 A-C
第三步 B-C
第四步 A-B
第五步 C-A
第六步 C-B
第七步 A-B
共移动7次完成了A杆上的三个金片,按照题目要求的规则移到B杆上。
题目要求将n个金片由杆A移到杆B可用同样的方法:
1.先(递归地)将杆A上面的n-1片移到杆C(利用杆B);
2.然后把杆A上唯一的一片移到杆B;
3.再把杆C上的n-1片(递归地)移到杆B(利用杆A)。
这是一个递归调用过程。程序如下:
program p6-14;
var
n:integer;
procedure move(n:integer; a,b,c:char); {定义递归过程}
begin
if n=1 then
writeln('move',n,'from',a,'to',b)
else {多于一片,递归进行}
begin
move(n-1,a,c,b); {递归地将n-1片从a搬到c,利用杆b过渡}
writeln('move',n,'from',a,'to',b); {最后一片从a搬到b}
move(n-1,c,a,b); {递归地将杆c上的n-1片搬到杆b,利用杆a过渡}
end;
end;
begin {主程序}
write('Input n:');
read(n);
move(n,'A','B','C');
end.
运行:
Input n: 3 (回车)
move