基于敏捷开发的数据结构研究
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 一个实例

下面给出在解决汉诺塔问题的递归算法基础上增加部分代码形成的演示程序,其中类似于“writeln(f,'1]#n,x,y,z;');”的输出语句用于执行程序时生成demo.txt演示脚本文件,get3str是把三个栈中的数据表示为一个格式化串的函数(详细叙述见4.3节)。在演示算法时,单步执行就是一步一步解释这些脚本行。

procedure ex22.hanoi(n: integer; x, y, z: string);
begin
    writeln(f,'1]#n,x,y,z;');
    writeln(f,'2]*n=',n,';*x=',x,';*y=',y,';*z=',z,';');
    writeln(f,'3]%;?',get3str,';');
    if n=1
       then begin
              move(x,1,z);
              writeln(f,'4]/将编号为1的圆盘从',x,'移到',z,';%;?',get3str,';');
            end
         else begin
              writeln(f,'5]');
              writeln(f,'6]<7 ',n,x,y,z,';/将',x,'上编号从1到',n-1,'的圆盘移到',y,'上,',z,'为
                       辅助塔;');
              hanoi(n-1,x,z,y);
              writeln(f,'7]>;*n=',n,';*x=',x,';*y=',y,';*z=',z,';');
              move(x,n,z);writeln(f,'7]/将编号为',n,'的圆盘从',x,'移到',z,';%;?',get3str,';');
              writeln(f,'8]<9 ',n,x,y,z,';/将',y,'上编号从1到',n-1,'的圆盘移到',z,'上,',x,'为辅助塔;');
              hanoi(n-1,y,x,z);
              writeln(f,'9]>;*n=',n,';*x=',x,';*y=',y,';*z=',z,';');
            end;
         writeln(f,'10]');
    end;
下面是演示算法中把n的值输入为3时,生成的脚本文件demo.txt的部分内容:
1]#n,x,y,z;
2]*n=3;*x=a;*y=b;*z=c;
3]%;?3,2,1##;
5]
6]<7 3abc;/将a上编号从1到2的圆盘移到b上,c为辅助塔;
1]#n,x,y,z;
2]*n=2;*x=a;*y=c;*z=b;
3]%;?3,2,1##;
5]
6]<7 2acb;/将a上编号从1到1的圆盘移到c上,b为辅助塔;
1]#n,x,y,z;
2]*n=1;*x=a;*y=b;*z=c;
3]%;?3,2,1##;
4]/将编号为1的圆盘从a移到c;%;?3,2##1;
10]
7]>;*n=2;*x=a;*y=c;*z=b;
7]/将编号为2的圆盘从a移到b;%;?3#2#1;
8]<9 2acb;/将c上编号从1到1的圆盘移到b上,a为辅助塔;
1]#n,x,y,z;
2]*n=1;*x=c;*y=a;*z=b;
3]%;?3#2#1;
4]/将编号为1的圆盘从c移到b;%;?3#2,1#;
10]