参考文章:http://www.cnblogs.com/dmego/p/5965835.html

 
一句话:学程序不是目的,理解就好;写代码也不是必然,省事最好;拿也好,查也好,解决问题就好!
 
信息时代不用信息就是罪过,直接抄不加理解与应用,就不是自己的,下次遇到还是不会,或许其中的某一个细节就能够用于各个问题的解决,共勉
 
学习一个东西总会遇到一些经典的问题,学习Python第二天尝试看一下汉诺塔问题,还是百度,看看解题思路,纯粹是重温初中课堂,越活越回去了
 
 汉诺塔的图解递归算法
 
一.起源:
 
  汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
 
二.抽象为数学问题:
 
  如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

解:(1)n == 1
 
       第1次  1号盘  A---->C       sum = 1 次
 
       (2)  n == 2
 
       第1次  1号盘  A---->B
 
       第2次  2号盘  A---->C
 
       第3次  1号盘  B---->C        sum = 3 次
 
  (3)n == 3
 
  第1次  1号盘  A---->C
 
  第2次  2号盘  A---->B
 
  第3次  1号盘  C---->B
 
  第4次  3号盘  A---->C
 
  第5次  1号盘  B---->A
 
  第6次  2号盘  B---->C
 
  第7次  1号盘  A---->C        sum = 7 次
三.调用方法的栈机制:(特点:先进后出)
 
       从主线程开始调用方法(函数)进行不停的压栈和出栈操作,函数的调用就是将函数压如栈中,函数的结束就是函数出栈的过程,这样就保证了方法调用的顺序流,即当函数出现多层嵌套时,需要从外到内一层层把函数压入栈中,最后栈顶的函数先执行结束(最内层的函数先执行结束)后出栈,再倒数第二层的函数执行结束出栈,到最后,第一个进栈的函数调用结束后从栈中弹出回到主线程,并且结束。
 
四.算法分析(递归算法):
 
       我们在利用计算机求汉诺塔问题时,必不可少的一步是对整个实现求解进行算法分析。到目前为止,求解汉诺塔问题最简单的算法还是同过递归来求,至于是什么是递归,递归实现的机制是什么,我们说的简单点就是自己是一个方法或者说是函数,但是在自己这个函数里有调用自己这个函数的语句,而这个调用怎么才能调用结束呢?,这里还必须有一个结束点,或者具体的说是在调用到某一次后函数能返回一个确定的值,接着倒数第二个就能返回一个确定的值,一直到第一次调用的这个函数能返回一个确定的值。
 
       实现这个算法可以简单分为三个步骤:
 
    (1)     把n-1个盘子由A 移到 B;
 
    (2)     把第n个盘子由 A移到 C;
 
    (3)     把n-1个盘子由B 移到 C;
 
从这里入手,在加上上面数学问题解法的分析,我们不难发现,移到的步数必定为奇数步:
 
    (1)中间的一步是把最大的一个盘子由A移到C上去;
 
    (2)中间一步之上可以看成把A上n-1个盘子通过借助辅助塔(C塔)移到了B上,
 
    (3)中间一步之下可以看成把B上n-1个盘子通过借助辅助塔(A塔)移到了C上;
 
四、Python实现
 
网上很多资料,只要理解就好,然后拿来自己用,遇到类似的递归问题,再举一反三
先看看JAVA实现,大学的时候看了几本JAVA的书,后来没怎么用过,也就忘了
public static void hanoi(int n,char A,char B,char C)
{
if(n == 1)//圆盘只有一个时,只需将其从A塔移到C塔
TowersOfHanoi.move(1, A, C);//将编b号为1的圆盘从A移到C
else
{//否则
hanoi(n - 1, A, C, B);//递归,把A塔上编号1~n-1的圆盘移到B上,以C为辅助塔
TowersOfHanoi.move(n, A, C);//把A塔上编号为n的圆盘移到C上
hanoi(n - 1, B, A, C);//递归,把B塔上编号1~n-1的圆盘移到C上,以A为辅助塔
}
}

定义一个汉诺塔函数

def hanoi(n, A, B, C):
if n==1:
print(A+'->'+C)
else:
hanoi(n-1, A, C, B)
print(A+'->'+C)
hanoi(n-1, B, A, C) hanoi(3, 'A', 'B', 'C')

函数作为参数直接调用

【学习】Python解决汉诺塔问题的更多相关文章

  1. python解决汉诺塔问题

    今天刚刚在博客园安家,不知道写点什么,前两天刚刚学习完python 所以就用python写了一下汉诺塔算法,感觉还行拿出来分享一下 首先看一下描述: from :http://baike.baidu. ...

  2. Python实现汉诺塔问题的可视化(以动画的形式展示移动过程)

    学习Python已经有一段时间了,也学习了递归的方法,而能够实践该方法的当然就是汉诺塔问题了,但是这次我们不只是要完成对汉诺塔过程的计算,还要通过turtle库来体现汉诺塔中每一层移动的过程. 一.设 ...

  3. python 游戏 —— 汉诺塔(Hanoita)

    python 游戏 —— 汉诺塔(Hanoita) 一.汉诺塔问题 1. 问题来源 问题源于印度的一个古老传说,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆 ...

  4. 编程:递归编程解决汉诺塔问题(用java实现)

    Answer: //Li Cuiyun,October 14,2016. //用递归方法编程解决汉诺塔问题 package tutorial_3_5; import java.util.*; publ ...

  5. 关于C语言解决汉诺塔(hanoi)问题

    C语言解决汉诺塔问题 汉诺塔是典型的递归调用问题: hanoi简介:印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣 ...

  6. 用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)

    汉诺塔问题源于印度的一个古老传说:梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.梵天命令婆罗门把圆盘按大小顺序重新摆放在另一根柱子上,并且规定小圆盘上不能放 ...

  7. python递归——汉诺塔

    汉诺塔的传说 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了 ...

  8. Python 实现汉诺塔问题(递归)

    有三根柱子一次为A,B,C 现在A柱子上有3个块,按照汉诺塔规则移动到C柱子上去,打印步骤? 我们这样理解:A为原始柱,C为目标柱,B为缓冲柱 1.定义一个函数move(n,a,b,c),n为原始柱上 ...

  9. Python之汉诺塔递归运算

    汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆 ...

随机推荐

  1. python MySQL-Slave从服务器状态检测脚本

    #!/bin/bash mysql -e "show slave status\G" > mysql_status.txt array=($(egrep 'Slave_IO_ ...

  2. git 仓库相关命令

    git配置文件 : .git/config 配置存储远程连接用户信息 [credential] helper = store 配置www用户下默认git pull账号和密码,这样每一个新加的项目都不用 ...

  3. DynArrayToVariant DynArrayFromVariant复制动态数

    type intArr=array of Integer; procedure TfrmMainDA.Button2Click(Sender: TObject);var aa:intArr;bb:in ...

  4. Ubuntu 18.04 rc.local systemd设置

    ubuntu18.04不再使用initd管理系统,改用systemd. 然而systemd很难用,改变太大,跟之前的完全不同. 使用systemd设置开机启动为了像以前一样,在/etc/rc.loca ...

  5. WPF Demo14 依赖属性

    using System.Windows; namespace DependencyPropertyDemo1 { public class Student:DependencyObject { pu ...

  6. 跟着未名学Office - 高效笔记OneNote

    了解OneNote 2016年12月22日    19:57 OneNote Summary 理解OneNote中的笔记本.分区.页的概念 编写人:未名 感谢秦大: http://www.zloffi ...

  7. TCP/IP学习20180625-DNS

    1 DNS:domain name system域名系統把域名,轉換成IP2 最開始是一個hosts.txt,後來是數據庫,最後是分佈式數據庫3 每個名字服務器存儲一部分名字.如果有不知道的名字,就轉 ...

  8. redis 安装配置 [转]

    Redis是目前众多NoSQL产品中非常有特点的一款,支持的数据类型和方法都非常丰富,做为一款具备持久化功能的软件,实际使中更多却是将其做为cache. 三思在个人的测试环境中安装使用了两三天,这期间 ...

  9. 【Properties】在Properties中配置List

    my.properties master.pool[0].id=poolId001 master.pool[0].endpoint=http://192.168.1.101:8080/v1 maste ...

  10. Scala传名参数(By-Name)

    1.=> 在了解Scala的By-Name参数之前,先了解下“=>”在Scala中有几种用法: 1.对于值,“=>”相当于lambda表达式.如: scala> List(,, ...