1. 问题背景
在世界某个地方有一个很虔诚的宗教组织,其中僧侣维护着一项神圣任务: 保持宇宙的时间。在时间的最开始,僧倡在平台上竖立了3个垂直杆,在最左侧杆上有64个不同半径的金色同心圆盘,直径较大的圆盘堆放在下方,形成了金字塔样子的整体外观。僧侣们的任务是将所有圆盘从最左侧杆子移动到最右侧杆子上,这个宗教认为当僧侣们完成任务的时候,万事万物将会化为乌有,宇宙将结束。为了保持神圣的顺序,僧侣们移动圆盘需要遵从特定的规则:一次只能移动一个盘子、盘子只能在3个标杆之间移动、更大的盘子不能放在更小的盘子上面。
2. 问题导入
请用python编写一个汉诺塔的移动函数,采用递归方法解决这个题目,要求输入汉诺塔层数,输出整个移动过程。
3. 问题分析
汉诺塔问题存在一个最小步数,就是通过移动最小的次数来达到解决问题的目的。先来看看前三层的最小步数和移动方式:
n = 1时,将A移动到C即可。
n = 2时,将第一层从A移动到B,再将第二层从A移动到C,最后将B移动到C。
n = 3时,将第一层从A移动到C,将第二层从A移动到B,将第一层从C移动到B,将第三层从A移动到C,将第一层从B移动到A,将第二层从B移动到C,将第一层从A移动到C。
······
再接着后来不难发现一个规律:当奇数层时,第一步必是将A移动到C,层数大于1的第二步必是将第二层从A移动到B。
当偶数层时,前两步必是将第一层从A移动到B,再将第二层从A移动到C。
其次,再仔细观察,二层汉诺塔,其实是化归为一层汉诺塔,三层汉诺塔其实是化归为二层汉诺塔,然后再化归为一层汉诺塔。依次可见,有一个粗略的递推模型已经出来了。
4. 准备
运用函数解题,首先要选取变量,变量又分为全局和局部,首先我们需要一个计数器,记录我们移动的次数,贯穿整个程序,毋庸置疑,这是一个全局变量,其次,我们需要知道圆盘层数,圆盘在A,B,C,三个杆移动的方式,这些可能在不同的时候做出相应的改变,先设它们为局部变量。
先运用1,2,3层得出的结论编写一个程序,然后再用接下来的若干层去检验。
5. 试编写
#一层试写
def hano(n,x,y,z): #n表示层数,x,y,z代表三根柱子
global count
if n == 1:
print('{}:{}->{}'.format(1,x