python实例——看看汉诺塔问题

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
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值