用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)
汉诺塔问题源于印度的一个古老传说:梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。梵天命令婆罗门把圆盘按大小顺序重新摆放在另一根柱子上,并且规定小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。当所有的黄金圆盘都重新摆放在另一根柱子上时,世界就将在霹雳声中毁灭,梵塔、庙宇和众生都将同归于尽。
假设A是起始柱,B是中间柱,C是目标柱。
从最简单的例子开始看:
- 如果A柱上只剩一个圆盘,那么将圆盘从A柱移到C柱即可。 (A --> C)
- 如果A柱上剩两个圆盘,那么先将小圆盘从A柱移到B柱,再将大圆盘从A柱移到C柱,最后将B柱上的小圆盘移到C柱。(A --> B, A --> C, B --> C)
- 如果A柱上剩三个圆盘,那么先将最小的圆盘从A柱移到C柱,再将中间大小的圆盘从A柱移到B柱,然后将C柱上的最小的圆盘移到B柱,然后将A柱上的最大的圆盘移到C柱,然后将B柱上的最小的圆盘移到A柱,继续将B柱上的中间大小的圆盘移到C柱,最后将A柱上的最小的圆盘移到C柱。 (A -->C, A -->B, C --> B, A --> C, B --> A, B --> C, A --> C) --- 前三步(A -->C, A -->B, C --> B)可以看成是A --> B的过程,中间是A --> C的过程,最后三步(B --> A, B --> C, A --> C)可以看成是B --> C的过程
综上所述,如果需要移动n个圆盘,那么整个过程可以抽象成以下三个步骤:
1. 将除底盘以外的圆盘(n-1个圆盘)从A柱移动到B柱
2. 将底盘从A柱移动到C柱
3. 将B柱上的圆盘(n-1个圆盘)移动到C柱
从最复杂的例子开始看:
- 如果A柱上有64个圆盘,最简单的做法是把A柱上的64个圆盘想象成一共是2个圆盘(底盘是一个圆盘,底盘上面的63个圆盘是一个圆盘),这样的话,只需先将A柱上的63个圆盘移动到B柱,再将底盘从A柱移到C柱,最后将B柱上的63个圆盘移到C柱。
- 如果A柱上有63个圆盘,则把A柱上的63个圆盘想象成一共是2个圆盘(底盘是一个圆盘,底盘上面的62个圆盘是一个圆盘),这样的话,只需先将A柱上的62个圆盘移动到B柱,再将底盘从A柱移到C柱,最后将B柱上的62个圆盘移到C柱。
- 以此类推,直到A柱上只剩一个圆盘,然后将该圆盘从A柱移到C柱即可。
综上可以看出,通过不断重复嵌套,这个问题可以用递归方法解决。
def hanoi(n,a,b,c): # n表示需要移动几个圆盘,a代表起始柱,b代表中间柱,c代表目标柱
if n==1: # 如果只剩1个圆盘,那么将圆盘从a柱移动到c柱即可
print(a,"->",c)
else: # 当n > 1时,用抽象出的3步来移动
hanoi(n-1,a,c,b) # 将n-1个圆盘从a移动到b
hanoi(1,a,b,c) # 将底盘从a移动到c
hanoi(n-1,b,a,c) # 将b上的n-1个圆盘移动到c
试一下移动3个圆盘的步骤是否和前文一致:
hanoi(3,"A","B","C")
运行结果如下:
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
可以看出,移动3个圆盘需要7步。根据推算,移动n个圆盘需要2n-1步。假设每次移动一个圆盘都是1秒钟的时间,婆罗门不停地在移动圆盘,那么总共需要(264-1)秒的时间,世界就会毁灭。按一年365天计,需要584,942,417,355.072年世界才会毁灭。
用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)的更多相关文章
- 汉诺塔问题(Hanoi Tower)递归算法解析(Python实现)
汉诺塔问题 1.问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根 ...
- 编程:递归编程解决汉诺塔问题(用java实现)
Answer: //Li Cuiyun,October 14,2016. //用递归方法编程解决汉诺塔问题 package tutorial_3_5; import java.util.*; publ ...
- 【学习】Python解决汉诺塔问题
参考文章:http://www.cnblogs.com/dmego/p/5965835.html 一句话:学程序不是目的,理解就好:写代码也不是必然,省事最好:拿也好,查也好,解决问题就好! ...
- 关于C语言解决汉诺塔(hanoi)问题
C语言解决汉诺塔问题 汉诺塔是典型的递归调用问题: hanoi简介:印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣 ...
- java 中递归的实现 以及利用递归方法实现汉诺塔
今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...
- C语言:使用递归解决汉诺塔问题。
//汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小 ...
- C#递归解决汉诺塔问题(Hanoi)
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExamp ...
- java 解决汉诺塔问题
//汉诺塔问题//HanYang 2016/10/15 import java.util.Scanner; //输出public class Hanuota { public static void ...
- python解决汉诺塔问题
今天刚刚在博客园安家,不知道写点什么,前两天刚刚学习完python 所以就用python写了一下汉诺塔算法,感觉还行拿出来分享一下 首先看一下描述: from :http://baike.baidu. ...
随机推荐
- Taro、Weex、Hippy 齐聚IMWebConf 2018!
IMWebConf 2018 前端大会,10 月 14 日重磅来袭! 想了解 2018 前端前沿技术和发展趋势?想挖掘前端更深远的价值?就在这个秋季,第七届 IMWebConf 大会重磅来袭,我们邀请 ...
- Python_每日习题_0007_copy
题目:将一个列表的数据复制到另一个列表中. 程序分析:使用列表[:],拿不准可以调用copy模块 import copy a = [,,,,['a','b']] b = a #赋值 c = a[:] ...
- H5 40-CSS精灵图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 2198: 小P当志愿者送餐
题目描述 在ICPC程序设计大赛期间,小P作为志愿者的任务是给各个学校送盒饭,小P一次最多可以携带M份盒饭.总共有N个学校来参加比赛,这N个学校的休息点在一条笔直的马路边一字排开,路的一头是小P取盒饭 ...
- Python—randonm模块介绍
random是python产生伪随机数的模块 >>> random.randrange(1,10) #返回1-10之间的一个随机数,不包括10 >>> random ...
- Python学习第十五篇——类继承和类实例化
学习Python类时,我们明白了类的本质,以及所谓的面向对象编程思想强调的对事物本身的属性,我们对某一类事物进行描述——采用了很多方法,这些方法描述了类的属性(比如猫科动物的眼睛,四肢,是否哺乳类等等 ...
- JS闭包以及作用域初探
以前看到的一个问题,很有意思: for (var i = 0; i < 5; i++) { setTimeout(function () { console.log(i); },500); } ...
- Alibaba Cloud Toolkit for Eclipse & ECS、EDAS 或容器服务 Kubernetes
UserGuide_V2.1.0http://toolkit.aliyun.com/eclipse/?spm=5176.2020520130.105.3.3c3b697bOHma9f&msct ...
- Windows BAT 命令下del 与 rd 命令
https://blog.csdn.net/jigetage/article/details/81180757 RD 与 DEL 命令 windows bat 目录和文件的删除处理. 命令:RD,删除 ...
- Windows 禁止 chrome 自动更新的方法
来源: https://www.cnblogs.com/zhouwanqiu/p/9329134.html 公司进行兼容性测试 需要chrome的浏览器版本, 但是 公司网络抽风 偶尔 总能是升级到最 ...