首页  »  递归

玩玩汉诺塔

朋友家有个八层的小汉诺塔.好玩心起我忍不住玩了一下,不料却一玩停不了手.从一开始要花三十分钟把八块塔片移动另一条柱子上,四次之后变成五分钟内完成,最后演变成手指速度的考验.汉诺塔的移动规律已了然于心.最好成绩是3分钟左右,玩下来后,唯一感觉就是手累.

汉诺塔的玩法很简单,就是要玩家把串在某一条柱子上的所有塔片都移动到另一条柱了,要求在移动过程中:
1.不能用大片压在小片上面
2.一次只能移动一片
3.塔片只能够在三条柱子中间转移,不能离开三条柱子.

我发现了一些规律:
1.按源柱的塔片数目算,如果是奇数,第一步先移往目标柱,反之则移往附助柱.
2.重复动作一直在重复.如在两次连续移动当中肯定有一个移动是最小的塔片的移动.也就是说小塔片的移动占了所有移动的一半.
3.过程中不断地变化三个柱子的身份,源柱,输助柱与目标柱.

后来在网上找到更有概括性的文字:
1.如果只有一个金片,则把该金片从源移动到目标棒,结束。
2.如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒

这是很明显的递归算法..既然这样,何不写一段代码算算自己三分多钟里面称动了多少次塔片:

python 代码
 
  1. def hano(count,source,target,help):
  2. if count == 1:
  3. print '%s -> %s'%(source,target)
  4. else:
  5. hano(count - 1,source,help,target)# 前N-1个移动附助
  6. print '%s -> %s'%(source,target)
  7. hano(count - 1,help,target,source)# 移动前N-1个到目标塔.
  8. hano(3,'B','A','C')

 

上面就是完整的汉诺塔的移动算法了.hano(3,'B','A','C')的意思是将三阶的汉诺塔从B柱移动到A柱.最后过程是这样的:
B -> A
B -> C
A -> C
B -> A
C -> B
C -> A
B -> A

三阶的汉诺塔移动的总次数为7次,换成8阶算了一下是255次.也就是说N阶的汉诺塔需要移动次数为2的N次方减1次.难怪说64阶的汉诺塔是一座庙里的和尚穷尽一生都不能移完的.我试一下把第一个参数换成了64,得到的结果是MemoryError.太牛了...计算机如此,何况人捏...要知道64阶的结果是18446744073709551615.

接下来再写程序分别计算一下每一个塔片的移动次数和行踪..

Meta

关于本博客...

关于黑莓手机、apple、twitter、互联网、web2.0以及生活的碎言碎语。请在twitter上 follow我,欢迎同好者talk to me bbmyth AT gmail.com。博客Hosting在 webfaction。

赞助商链接

我看我听我读

最新评论

标签

python 空间 开发 计划 年假 工作 诗歌 音乐 西片 恐怖 惊变 django mysql rss 文艺片 太阳 彩色 电影 apache 部署 factcgi lighttpd javascript editor MYMeditor sql 日志 java hibernate orm 数据库 英伦 摇滚 原创 中间件 朋友 erlang 并发 函数式编程 旅游 云南 丽江 发呆 学习 编程 技术 lucene 全文搜索 中文分词 乐队 模板 分页 成功 google pagerank 中文 更新 个性化 秋天 互联网 web ext json ajax 事业 职业 读书 开源 香港 澳门 忧郁 冬天 compass dvd 广州 地下 暴力 美学 声音玩具 独立 备份 数据 琐事 博客 生活 体验 卖唱 接口 设计模式 图表 wiki moin 遇窃 air ria 需求 设计 信息 健康 感悟 人生 真诚 life jquery 杭州 灾害 2008 中国 灾难 哀悼日 jmesa grails flex flash 捐赠 scrum 软件过程 快速开发 plone cms nuexo zope 左小诅咒 demo prototpye AMF actionscript 汉诺塔 算法 递归 结婚 感情 opensource 网络 beautifulSoup 管理 大理 香格里拉 休假 鼻炎 许巍 感性 2009 随想 cpug 聚会 出差 北京 api 创业 商城 blackberry 手机 TD 交流 处事 为人 房子 经济 手机仿真 在线服务 嵌入式 海鲜 p2p easymule apple 技巧 thing gtd task gfw vpn 穿墙 代理 软件管理 翻译 mac 英语 caffeine 休眠 搬家 主机 prism firefox mozilla 免费 php codeigniter url blogspot mindmap mindnode htmlparse easyurl 产品 黑莓 rim 试手机 豆瓣 twitter 微博 杂记 时空 亲人 dabr webfaction host 快速查看 safari appale 桌面 snow 升级 leopard finder 权限 glims python主机 合租 ruby主机 快捷键 itunes 时间管理 原型 画图 招聘 hosting 写作 软件 家庭 广州技术沙龙 postgres 云计算 fuckgfw 内容审检 谷歌 chrome linux odbc database freetds R 统计 书签 浏览器 bookmark tinymce 文件管理 分享 忙碌 旅行 马来西亚 图维导图 freemind 工具 pinax develope shell dropbox barcamp

日志分类

友情链接

博客归档

PowerBy