用递归方法解决汉诺塔问题(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. ...
随机推荐
- 关于eclipse tomcat 无法启动(8080,8005,8009端口被占用)的解决方法,附 eclipse tomcat 与 tomcat 并存方式
eclipse 在编译运行时 新建的tomcat连接始终为stopped状态,描述为8080,8005,8009端口被占用. 这是因为在装完tomcat后,tomcat服务已启动,而eclipse仅仅 ...
- MemSQL与MySQL不兼容问题总结
1.数据行Update更新数据行时,如果数据行没有变化,MySQL返回受影响的数据行数为1,但MemSQL返回的数据行数为0. 2.MemSQL不支持唯一约束 3.MemSQL不支持外键约束
- Linux系统安装python3
Centos7系统安装python3 在安装前需要安装依赖环境包,先安装gcc 编译器,命令如下: yum -y install gcc gcc-c++ make 1.首先查看是否安装python,系 ...
- p2394 精度题
题意:输出n/23即可 解法一: 利用高精度的long double直接输出,但由于n的长度不确定,我们要加个限制%12Lf #include <cstdio> int main(){ l ...
- C. Nastya Is Transposing Matrices
链接 [https://codeforces.com/contest/1136/problem/C] 题意 给你两个规模一样的矩阵 问是否可以通过不断选取A矩阵的子"方正"转置得到 ...
- 使用faker去构造一个User-Agent
faker可以仿造各种各样的信息,可以使用faker去构造一个User-Agent from faker import Factory f = Factory.create() 'User-Agent ...
- Ajax中文乱码的解决
网上有很多解决Ajax中文乱码的例子,昨晚弄了很久,最终确定一种“确实”有效地方法.首先我有必要说明一下我遇到的情况:有一个注册页面,注册用户填完信息并提交后,页面获得信息并通过java servle ...
- 解决mysql1336
1.mysql字符集与插入数据字符集不匹配 USE 数据库名称SHOW VARIABLES LIKE 'character%'SET character_set_server=utf8;SET cha ...
- HDU 2001 计算两点间的距离
http://acm.hdu.edu.cn/showproblem.php?pid=2001 Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离 ...
- Docker存储驱动Device Mapper,Overlay,AUFS
Docker存储驱动之Device Mapper简介 - BookShu - 博客园https://www.cnblogs.com/styshoo/p/6528762.html Docker存储驱动之 ...