快速理解汉诺塔问题(递归算法)

问题如下:
假设一共有n个盘子,由1号盘到n号盘依次增大。
记作:
P_{1},P_{2},P_{3},P_{4}.........P_{n-2},P_{n-1},P_{n}
其中 P_{1}最小, P_{n}最大。
一共三根柱子;A(start)柱子,B(middle)柱子,C(end)柱子。
注意A,B,C后面的括号里的内容,start代表初始放置柱子,middle代表中转柱子,end代表目标柱子。
问题开始时,start柱子上n个盘子从上到下按从小到大的顺序排列。
middle柱子和end柱子上没有圆盘。
当问题结束时,start柱子和middle柱子上没有圆盘,而end柱子上n个盘子从上到下按从小到大的顺序排列。
---------------------------------------------------------------------------------------
问题的解法一共三大步骤:
步骤1:将A(start)柱子上 P_{1}.........P_{n-1}以某种方法全部放到B(middle)柱子上(此时A(start)柱子只有 P_{n},middle柱子上有 P_{1}........P_{n-1},而C(end)柱子上没有盘子)
步骤2:将A(start)柱子上仅存的 P_{n}挪到空无一物的C(end)柱子上。
步骤3:将B(middle)柱子上剩余的 P_{1}......P_{n-1}全部挪到C(end)柱子上。
---------------------------------------------------------------------------------------
就是这三步。第二步最好理解,
因为如果 P_{1}......P_{n-1}不全在B(middle)柱子上的话, P_{n}也就无法从A(start)柱子挪动到C(end)柱子上。
同时既然 P_{1}......P_{n-1}都在B(middle)柱子上,那么他们的排列顺序一定是从上到下从小到大。
---------------------------------------------------------------------------------------
下面详解步骤1和步骤3
对于步骤1:完全可以看作是将n-1个盘子由A(start)盘子经由C(middle)盘子挪动到B(end)盘子上。
A仍是初始放置柱子,但此时对于这n-1个盘子,中转柱子B变成了目标柱子B(end),而C柱子成为了中转柱子。
对于步骤3:此时前n-1个盘子都在B柱子上,要将他们挪动到C(end)柱子上,此时B柱子对于这n-1个盘子是初始位置盘,是B(start)。而A柱子成为了中转柱子,是A(middle)。
所以明白了吧?
步骤1和步骤3都分别是一次独立的汉诺塔问题,区别在于:
常规汉诺塔问题:n个盘子,从A(start)柱子,经由B(middle)柱子,到C(end)柱子。
步骤1的汉诺塔问题:n-1个盘子,从A(start)柱子,经由C(middle)柱子,到B(end)柱子。
步骤3的汉诺塔问题:n-1个盘子,从B(start)柱子,经由A(middle)柱子,到C(end)柱子。
---------------------------------------------------------------------------------------
而步骤1又可以变成:
步骤1.1:n-2个盘子,从A(start)柱子,经由B(middle)柱子,到C(end)柱子。
步骤1.2:最大的盘子 P_{n-1}从A(start)柱子,一步,到B(end)柱子
步骤1.3:n-2个盘子,从C(start)柱子,经由A(middle)柱子,到B(end)柱子。



步骤1和步骤3均包含 2^{n-1}-1次挪动,步骤2包含1次挪动。总体是 2^{n} -1次挪动
---------------------------------------------------------------------------------------
以下是用java写的程序,帮助你理解




转自知乎@戲光師 ,侵删

自我感觉是比较好理解的一个,包括注释!


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值