汉诺塔的递归算法很好理解,为什么这个非递归就这么难理解?
一般递归算法都可以用栈转化成非递归算法,譬如求阶乘等,都比较好理解。汉诺塔的递归算法也好理解,但转化成非递归我理解起来就是不甚了了,似是而非。请高手们帮我指点指点,讲解讲解!
汉诺塔的递归算法简洁明了,很好理解,程序如下
PROCEDURE Hanoi(n:integer; x,y,z:CHAR);
BEGIN
IF n=1
THEN move (1,x,z)
ELSE BEGIN
hanoi(n-1,x,z,y);
move (n,x,z);
hanoi(n-1,y,x,z);
END;
END;
其改为非递归算法后就让我比较头疼了,如下:
PROCEDURE Hanoi(n:integer; x,y,z:CHAR);
CONST m=100;
TYPE snode=RECORD
n:integer;
x,y,z:char
END;
VAR S:ARRAY[1..m] OF snode;
H,t: integer; a,b,c,k: char;
G:0..1;
BEGIN
t:=0; a:=x; b:=y; c:=z; H:=n;
REPEAT
IF H=1
THEN BEGIN
G:=0; move(1,a,c)
END
ELSE BEGIN
t:=t+1; s[t].n:=H;
s[t].x=a; s[t].y:=b;
s[t].z:=c; H:=H-1;
k:=c; c:=b;
b:=k; G:=1
END;
IF (G=0) AND (T>0)
THEN BEGIN
G:=1; H:=s[t].n;
a:=s[t].x; b:=s[t].y;
c:=s[t].z; t:=t-1;
move(H,a,c); H:=H-1;
k:=a; a:=b; b:=k
END
UNTIL (G=0) AND (t=0)
END;
(注:算法中G是标志位,move(H,a,c)过程是将H号盘从钢针a移到钢针c)