一个学期没写过代码了,刚好现在开始学Python,看到了汉诺塔问题。大一上的时候也模模糊糊的,趁现在梳理一下。
问题重述:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘
引用自:https://blog.csdn.net/qq_41879343/article/details/88671673
利用函数递归的思想写的话,就要将其先看做一个递归问题。
1 将1号柱的n-1个盘借助3号柱移到2号柱
2 将1号柱的最后一个盘移到3号柱
3 将2号柱的n-1个盘借助1号柱移到3号柱
可以看到,其1,3步骤都要调用自身,但其柱子序号有变动。
因此可以将函数的参数设置为4个,分别是:盘数,起始柱子,中间柱,目标柱。
而在1,3号步骤通过改变传入参数的顺序来区分不同步骤下的各个柱子号。
Python的代码如下:
def move(n, a, b, c):
if n == 1:
print(a, '-->', c)
else:
move(n-1, a, c, b)
print(a, '-->', c)
move(n-1, b, a, c)
return
PS:其实这道题搞了挺久的,原因在于我一方面没有先从数学上对它完成递归,另一方面在于我把柱子的序号没有进行区分,在思考上,应该要区分实际柱子的编号与柱子本身的职能。比如说:2号柱子在步骤1是 目标柱,而在步骤3是中间柱。区分了这个之后,整个递归在思维和代码复现中才不会有特别大的问题。