最新网站查询工具贵州省住房和城乡建设厅证件查询
web/
2025/10/8 11:57:05/
文章来源:
最新网站查询工具,贵州省住房和城乡建设厅证件查询,网站名字要备案吗,网页基本三要素前言
先讲个故事#xff0c;传说古代印度有三根黄金柱#xff0c;64个石盘#xff0c;需要将石盘从第一根移动到第三根上#xff0c;规定每次只能移动一片#xff0c;并且小盘在放置时必须在大盘上。 当石盘移动完毕时#xff0c;世界就会毁灭。
汉诺塔——递归
接下来…前言
先讲个故事传说古代印度有三根黄金柱64个石盘需要将石盘从第一根移动到第三根上规定每次只能移动一片并且小盘在放置时必须在大盘上。 当石盘移动完毕时世界就会毁灭。
汉诺塔——递归
接下来我们用程序来模拟这个移动过程并计算世界毁灭需要的时间。
这里使用的策略就是递归 我们将黄金柱编号为A,B,C,我们首先需要将A柱最底层的64号大石盘移动到C柱上那么我们可以认为有一个大力士将63号以及之前的石盘已经被放在了B柱上。B柱是辅助柱。这时我们就可以轻松将A柱剩下的一个最大的64号石盘放到C柱上此时我们完成了第一步。
同理假设64号石盘已经被放在了C柱上63号石盘此刻也需要被放在C柱上我们也能认为有一个大力士将62号以及之前的石盘已经被放在了B柱上。以此类推。 我们不用管大力士是如何做到的我们每次只需要将最后一块相对最大的石盘放到C柱上就行了。这就是每一次移动石盘最终的目的。 所以每次在C柱上能够正常进行叠放的最后一步都是一个单独的石盘等着被放在C柱上我们轻松的将64号63号62号…1号放到C柱上 而实际上大力士是我们递归的自己这个又该怎么理解呢 用python写就是这样
def hanoiTower(n,source,auxiliary,target):# 如果就剩下最后一块那么直接叠放到目标柱上需要注意的是目标柱并不是不变的会变成辅助柱因为搬运过程中进入子递归会把辅助柱当做目标柱大力士需要先把63块之前的所有石盘放到辅助柱上# 每次迭代都将最后一块设定为终极目标搬完最后一块就表明最后一个小任务完成了if n1:print(f{n}号石盘搬运{source}--{target})else:#大力士将n-1块石盘从源头柱放到辅助柱这样最底层的石盘就暴露了出来# 将n-1个盘子从源柱移动到辅助柱此时辅助柱成为子问题的目标柱hanoiTower(n-1, source, target, auxiliary)print(f{n}号石盘搬运{source}--{target})# 大力士将n-1块石盘从辅助柱放到目标柱就算之前的任务完成了# 将n-1个盘子从辅助柱移动到目标柱此时源柱成为子问题的辅助柱hanoiTower(n-1, auxiliary,source, target )
hanoiTower(3,A,B,C)1号石盘搬运A--C
2号石盘搬运A--B
1号石盘搬运C--B
3号石盘搬运A--C
1号石盘搬运B--A
2号石盘搬运B--C
1号石盘搬运A--C计算时间复杂度空间复杂度距离世界毁灭剩余的时间
每次任务分解都是两次移动n-1个盘子和一次移动单个盘子 因此T2T(n-1)1 根据实际情况可以将其展开递归到第二次时T2(2T(n-2)1)1 递归第三次时T2(2*(2*T(n-3)1))1 一次类推展开可以知道n1时就是递归结束的时候此时T(1)1 T2^n-1 时间复杂度为O(2^n)
空间复杂度 处理n个盘子时递归调用链为n,n-1,n-2,n-3…1,最大深度所以为n,空间复杂度为O(n)
那么根据传说算出来2^64时间长度为11698.8483亿年这个时间说是宇宙末日确实有可信度。 毕竟1万亿年以后的超人僧侣1s就能抬起巨石将圆盘准确无误的放到C黄金柱上本宇宙汉诺塔也新修建完毕宇宙终于再次放起了烟花大爆炸开始了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/89042.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!