Python模拟汉诺塔问题移动盘子的过程

据说古代有一个梵塔,塔内有三个底座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,在移动盘子的过程中可以利用B座,但任何时刻3个座上的盘子都必须始终保持大盘在下、小盘在上的顺序。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C即可。和尚想知道这项任务的详细移动步骤和顺序。这实际上是一个非常巨大的工程,是一个不可能完成的任务。根据数学知识我们可以知道,移动n个盘子需要2^n-1步,64个盘子需要18446744073709551615步。如果每步需要一秒钟的话,那么就需要584942417355.072年。

def hannuo(num, src, dst, temp=None):

'''把num个盘子从src移动到dst,可以借助临时柱子temp'''

#声明用来记录移动次数的变量为全局变量

global times

#只剩最后或只有一个盘子需要移动,这也是函数递归调用的结束条件

if num == 1:

print('The {0} Times move:{1}==>{2}'.format(times, src, dst))

times += 1

else:

#递归调用函数自身

#先把除最后一个盘子之外的所有盘子移动到临时柱子上

hannuo(num-1, src, temp, dst)

#把最后一个盘子直接移动到目标柱子上

hannuo(1, src, dst)

#把除最后一个盘子之外的其他盘子从临时柱子上移动到目标柱子上

hannuo(num-1, temp, dst, src)

#用来记录移动次数的变量

times = 1

#A表示最初放置盘子的柱子,C是目标柱子,B是临时柱子

hannuo(4, 'A', 'C', 'B')

运行结果为:

The 1 Times move:A==>B

The 2 Times move:A==>C

The 3 Times move:B==>C

The 4 Times move:A==>B

The 5 Times move:C==>A

The 6 Times move:C==>B

The 7 Times move:A==>B

The 8 Times move:A==>C

The 9 Times move:B==>C

The 10 Times move:B==>A

The 11 Times move:C==>A

The 12 Times move:B==>C

The 13 Times move:A==>B

The 14 Times move:A==>C

The 15 Times move:B==>C

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2016-11-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术之路

ios 接收 c# socket udp 组播

最近用wcf 服务 给ios和安卓做接口,做了几个ios的项目  用udp 组播 让ios多终端接收和刷新方法 做一个简单的小例子会把工程给大家下载的   c#...

27480
来自专栏iOS开发攻城狮的集散地

UIActivityViewController系统原生分享-仿简书分享

46480
来自专栏哈雷彗星撞地球

iOS 中如何判断当前是2G/3G/4G/5G/WiFi

5G 什么的,还得等苹果API更新啊,不过将来还是这个处理过程就是了。 关于判断当前的网络环境是2G/3G/4G,这个问题以前经常看到,最近在一工程里看到了如...

25420
来自专栏流柯技术学院

使用loadrunner进行压力测试之----post请求

2. 如果要发送的请求的数据值需要变化,那么需要将请求中的值参数化,,如果是根据上一条请求的返回值来确定请求中的数据值,那么需要对上一条请求的返回值进行解析

11810
来自专栏一“技”之长

iOS通过NSUserDefaults实现简单的应用间数据传递

NSUserDefaults是用于保存应用程序设置,应用信息等轻量级数据的的一个类,其本质是将数据写为plist文件的形式保存在本地。在IOS中,系统为每一个应...

9820
来自专栏wOw的Android小站

[Objective-C] KVC 和 KVO

KVC是一种用间接方式访问类的属性的机制。比如你要给一个类中的属性赋值或者取值,可以直接通过类和点运算符实现,当然也可以使用KVC。不过对于私有属性,点运算符就...

19310
来自专栏遊俠扎彪

CentOS 5.6 下使用 vsFTPd 架设 FTP Server

主要配置文件/etc/vsftpd/vsftpd.conf,配置如下:

24950
来自专栏慎独

UIViewController生命周期分析

17940
来自专栏DannyHoo的专栏

KVO代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

9710
来自专栏陈满iOS

[iOS源码笔记]·第三方网络图片处理框架:SDWebImage网络下载及缓存管理策略

typedef void(^SDExternalCompletionBlock)(UIImage * _Nullable image, NSError * _N...

15010

扫码关注云+社区

领取腾讯云代金券