递归算法——汉诺塔

 汉诺塔的代码很好读懂,只有简单的递归规则而没有具体算法,

汉诺塔移动的操作其实只有三步:第一步,留下要移动的柱子中最大那个圆盘,其余上方所有圆盘堆移动到其他柱子上,第二步,把最大的底部圆盘那个放到b上,第三步,再把刚才移动到另一个柱子上的圆盘堆移动到b上

而实际上三根柱子我们可以看作组成了一个三角形,当我们需要将堆从a移动到c,就需要借助b作为交换的辅助,同理然后我们需要将堆从c移动到b,我们就需要a作为辅助,因此我们设定函数hanoi(n,m1,m2,m3)指的是将n个圆盘组成的堆从柱子m1借助柱子m3移动到柱子m2

想想看,我们是不是全程都是这样做的?无论是我们开始移动的圆盘堆,还是最终结果,圆盘的堆叠始终是自底向上从大到小放在一堆的,如果要进行下一次移动,我们会留下最大的那个圆盘,然后把上方的圆盘的顺序堆从一个柱子借助另一根辅助柱子,将其按顺序原封不动地移动到目标柱子,最后在最终移动的目标柱子上放上最后的那个大圆盘。

hanoi(n-1,a,c,b),n是我们最后要放的最底部的圆盘,把我们需要处理n-1个圆盘组成的圆盘堆从a借助b移动到c

move(a,b)把最大的底部圆盘放到b上

hanoi(n-1,c,b,a)把刚才移动到c的n-1圆盘堆借助a辅助移动到b上

这样我们就按照之前说的三步法实现了圆盘的移动,至于hanoi具体如何移动的代码例题并没有给出

而从这三个例子中我们也要学会递归的真正思维——最重要的不是怎么实现递归,而是怎么找到规则,递归是对函数的嵌套,函数则是我们的规则,而递归函数相当于f(x)以自身作为复合函数    f(f(x)),因此也不要忘记设置退出的条件。这是一个逻辑问题,如果我们找到递归的规则,实现它倒只是小事一桩了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值