汉诺塔的递归算法很好理解,为什么这个非递归就这么难理解?

bright5 bright5 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
一般递归算法都可以用栈转化成非递归算法,譬如求阶乘等,都比较好理解。汉诺塔的递归算法也好理解,但转化成非递归我理解起来就是不甚了了,似是而非。请高手们帮我指点指点,讲解讲解!
汉诺塔的递归算法简洁明了,很好理解,程序如下
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)
...全文

相关推荐

汉诺塔问题的非递归算法

在理解并应用非递归算法解决汉诺塔问题的过程中,我们能够体会到算法设计的精妙,以及通过逻辑思维和策略规划来解决复杂问题的重要性。

ly8008csko

汉诺塔问题的非递归算法实现

在非递归算法设计中,栈(Stack)和队列(Queue)是最为常见的数据结构。栈是一种后进先出(LIFO, Last In First Out)的数据结构,只能在一端(称为栈顶)进行插入和删除操作。队列是一种先进先出(FIFO, First In First Out)的数据结构,支持在一端添加元素,而在另一端移除元素。对于栈而言,它适用于那些需要回溯或撤销操作的场景,例如表达式求值、浏览器的后退功能等。队列则非常适合处理按顺序排列或处理的任务,如任务调度、打印队列等。

喵喵蜜

7-15 汉诺塔的非递归实现

借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。 输入格式: 输入为一个正整数N,即起始柱上的盘数。 输出格式: 每个操作(移动)占一行,按柱1 -> 柱2的格式输出。 输入样例: 3 输出样例: a -> c a -> b c -> b a -> c b -> a b -> c a ->

Jormungand_1

汉诺塔的非递归实现,c++

通常,汉诺塔问题的解决方案采用递归算法。然而,在这个案例中,我们将讨论一种非递归的C++实现方法。非递归算法通常通过使用数据结构(如栈)来模拟递归过程,从而避免了递归调用带来的额外开销。

q123zhao2008

汉诺塔-汉诺塔的非递归实现源码和原理讲解

理解和实现这个算法有助于深化对数据结构和算法的理解,以及在实际编程中解决类似问题的能力。

zenglizz
评论 28
收藏 已收藏
分享
返回顶部
bright5
数据结构与算法 33,026 成员 35,334 内容