汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
这篇文章是我结合最后2篇文章给出了自己对于汉诺塔的理解
题目的解题思路主要分3步:(柱子从左到右分别为a、b、c)
1 把除最大盘外的所有盘子挪到b上(实际上任何一个空柱子上都可以,因为对题目最终解题没影响)
2 把最大盘挪到c上
3 把b上所有的盘子挪到c上
而关键的解题步骤也就是运用递归思想的地方就是第3步,即把b上除最大盘的所有盘子挪到a上(此时的最大盘就是原始盘子的第2大)然后再像第2步一样把最大盘(就是原始盘子的第2大)挪到c上
如此反复,最终釜底抽薪一般把所有当下的最大盘垒起来
理解之后,代码的解决又是另一回事
def move(x,a,b,c)这个函数的含义指,移动n个盘,从a柱到c柱,以b柱为辅助。
所以就明白move(x-1,a,c,b)就是先把x-1个盘借助c柱,从a柱移动到b柱,
之后移动最底盘move(1,a,b,c)到c柱。
这时a柱空了,b柱上是x-1个盘子。c柱上是最大盘。
之后移动b柱上剩下x-1个盘,move(x-1,b,a,c),借助于a柱,从b柱移动到c柱
==================
但是我们还需要实现步数的计算 我理解出来的是盘子的总数每增加一个都是 *2+1
还是要先复盘我们的基本解题思路
题目的解题思路主要分3步:
1 把除最大盘外的所有盘子挪到b上(实际上任何一个空柱子上都可以,因为对题目最终解题没影响)
2 把最大盘挪到c上
3把b上所有的盘子挪到c上
打个比方,所有大盘只有1个盘的情况下实现汉诺塔所需步骤为1 也就是说,挪动一个只有1个盘子的汉诺塔我们只需要一步
而当汉诺塔总共有2个盘子的时候我们需要走3步骤
1 先把小汉诺塔(除却最大盘的汉诺塔,此处为只有一个盘子的汉诺塔)挪到一边(此处为b)
2 把最大盘挪到c上(这一步骤永远只需要花1步)
3 把小汉诺塔移到c上,其实就等于把小汉诺塔挪到一边(只不过此处是最大盘)
所有就等于2个相同操作+一个步骤永远为1的操作
即总步数 = 2*x + 1
而x的多少就涉及到递归的思想,tip:x为小汉诺塔实现汉诺塔目标的步数
所以,自然而然地就涉及到了递归。拿此处为例子
2个盘子的汉诺塔实现目标所要花费的总步数 = 1个盘子的汉诺塔实现目标所要花费的总步数*2 + 1
所以等于3 然后我们去实现一下代码
(新人第一次写博客,如有不当之处,敬请批评指正)