有一个很著名的问题叫汉诺塔问题
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
这个问题似乎每一次移动都可以用很多种移动方法,但实际上我们简化一下就会发现,如果A上一共有n个圆盘,那么我们首先要做的就是利用C把上面的n-1个圆盘移动到B上,然后A上的最后一个圆盘移动到C,之后再对B上的n-1个圆盘,利用空出来的A进行同样的操作,直到最后一个圆盘移动完毕。看起来这似乎是一个循环而不是递归,但实际上仔细分析一下,对于n个圆盘,我们要先移动上方的n-1个,而对于n-1个我们要先移动上方的n-2个…对于两个,我们要先移动上方的一个,对于1个我们可以直接移动。这是一个递归的过程,而递归的终点就是只有一个圆盘的情况。
这是在学习python时的一道练习题,那就用python来写吧
# n 代表要移动的圆盘个数,a,b,c表示三根圆柱
# a 表示起始柱(圆盘都在这跟柱子上)
# b 表示辅助柱,用于辅助移动的中间柱
# c 表示最终柱,最终所有的圆盘都要移动到这跟柱子
def hanoMove(n, a, b, c):
if n == 1:
print(a + "-->" + c) # 只i移动一个时,可以直接移动到C柱
else:
# 首先将起始柱的n-1个圆盘移动到辅助柱
# 注意我们此时要移动到B柱,因此B柱是此时的最终柱,C是辅助作用
hanoMove(n - 1, a, c, b)
# 然后将起始柱上的最后一个移动到最终柱
# 此时我们将A柱上的移动到C柱,C是最终柱,B是辅助作用
hanoMove(1, a, b, c)
# 最后将B柱上的移动到C柱
# 此时B柱为起始柱,C柱为最终柱,A辅助,这其实是对上述两步的再次执行
hanoMove(n - 1, b, a, c)
# 试一下5个圆盘的移动
hanoMove(5, "A", "B", "C")
执行之后打印出来的结果是
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
A-->B
C-->B
C-->A
B-->A
C-->B
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
B-->A
C-->B
C-->A
B-->A
B-->C
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
天知道对不对🤣