用递归来解决Hanoi塔问题

在大学里,Hanoi塔问题被视为学习递归的经典例子。希望这篇文章能给大家解惑。:)

在十九世纪末,欧洲风行的一种游戏。并大肆宣传说,布拉玛神庙的教士所玩的这种游戏结束之日就是世界毁灭之时。该塔由三根固定金刚石插针和堆放在一根针上有小到大的64个金属盘片组成,目的是借助于中间,从左边移到右边。规则是:一次移动一个盘;无论何时,小盘在上,大盘在下。( 取自百度百科 )

如下图:

用递归来解决Hanoi塔问题_第1张图片

首先我们把这个N层Hanoi塔抽象成两层(除了最底一层,其他为一个整体)。

用递归来解决Hanoi塔问题_第2张图片

接着我们来算下移动的次数:
0x01  第N层(最底红色那层)从位置A到位置C,只需移动1次
0x02  N-1层(整体)先从位置A到位置B,最后再到位置C,N-1层移动了两次。
0x03  假设将N-1层从A移动到B需要 S (N-1) 次,所以我们可以得出

S(N) = 2 * S(N-1) + 1

当 N=1 时 S(1) = 2 * S(N-1) +1,成立
假设N=K时,成立。
显然这是个等比数列,q=2 , a1 = 1 .
所以有 S(K) = 2^K - 1 。
当N=K+1 ,有 S(K+1) = 2 * S(K)-1 =2*(2^K-1)+1 = 2^(k+1) -1

所以移动N层Hanoi塔,符合 2^N-1规律。

原图都是从网上找来的,只是稍加处理,懒~~

理解之后,用代码很快就能实现了,这里仅提供解法就不贴代码了(懒癌症又犯了 )


接下来是非常COOL的Idea (使用二进制来解决Hanoi塔问题)

这是从Youtube大神学到的,被翻译搬到Bilibili,地址如下:
https://www.bilibili.com/video/av7398130/

Hanoi塔算法与二进制计数自相似

eg:现在有三层Hanoi塔,共需要移动7次.

用递归来解决Hanoi塔问题_第3张图片

当第一个二进制位为1时,相应最上面的盘子移动到右边柱子。

当第二个二进制位为1时,移动第二盘子。

每次二进制进位,对应的盘子做出移动。

可以看出移动好三个盘子对应二进制数为 111 ,以此规律可以求出N盘子的Hanoi塔。

这很酷,是怎么办到的?
我们可以将上面得到的 2^N - 1 化成二进制,如2^3 - 1 = 0111 , 这样一下子就看出来了,令人惊叹的巧合。


仅仅这样子吗?相信我 ,你肯定想不到 ,原先的二进制解法转换成三进制。神奇的是,我们还可以用这个新的三进制解法,找到一条填满谢尔宾斯基三角形的分形曲线。将Hanoi塔抽象成N层递归N-1层,我们可以找到Hanoi与谢氏三角的共性——分形。

附上大佬链接:
https://www.bilibili.com/video/av7539453/ (看到好东西,总想安利给大家:P)

你可能感兴趣的:(数学)