【Python学习】Python解决汉诺塔问题

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

一句话:学程序不是目的,理解就好;写代码也不是必然,省事最好;拿也好,查也好,解决问题就好!

信息时代不用信息就是罪过,直接抄不加理解与应用,就不是自己的,下次遇到还是不会,或许其中的某一个细节就能够用于各个问题的解决,共勉

学习一个东西总会遇到一些经典的问题,学习Python第二天尝试看一下汉诺塔问题,还是百度,看看解题思路,纯粹是重温初中课堂,越活越回去了

 汉诺塔的图解递归算法

一.起源:

  汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

二.抽象为数学问题:

  如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

![image](https://yqfile.alicdn.com/451bad65007292a4ffb6e348f7da62a807ac9d77.png)

解:(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')

函数作为参数直接调用

时间: 2024-09-19 04:14:26

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

Java使用递归法解决汉诺塔问题的代码示例_java

汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图). 有一个和尚想把这n个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上.在移动过程中可以利用B座,要求打印移动的步骤.如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C. 如果有2个盘子,可以先将盘子1上的盘子2移动到B:将盘子1移动到c:将盘子2移动到c.这说明了:可以借助B将2个盘子从A移动到C,当然,

递归解决汉诺塔问题

前言:汉诺塔问题是源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在第三根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 我们用递归算法来解决这个问题,在解决之前首先介绍一下什么是递归算法. 1.递归算法 在解决一些复杂问题时,为了降低问题的复杂程序,通常是将问题逐层分解,最后归结为一些最简单的问题.这种将问题逐层分解的过程,并没有对问题进行求解,而

使用python实现递归版汉诺塔示例(汉诺塔递归算法)_python

利用python实现的汉诺塔.带有图形演示 复制代码 代码如下: from time import sleep def disp_sym(num, sym):        print(sym*num, end='') #recusiondef hanoi(a, b, c, n, tray_num): if n == 1:  move_tray(a, c)  disp(tray_num)  sleep(0.7)  else:  hanoi(a, c, b, n-1, tray_num)  mov

用javascript编制一个递归算法来解决汉诺塔问题

传说某间寺院有三根柱子,在创世之初,第一根柱子串有64个金盘,盘的尺寸由下到上一个比一个小.寺院里的僧侣依照一个古老的预言,每天移动一个盘:大盘不能叠在小盘上面,预言说盘子全部移动到到第三根柱子时,世界就会灭亡. 最少移动步数是随着盘子的个数呈指数增长(2^n-1)的.对指数增长有概念的同学应该能够看出移动64个盘子所需的步数是个天文数字,即使僧侣们每秒可完成一个盘子的移动,也需要5846亿年才能完成,整个宇宙现在也不过137亿年.这个世界灭亡传说的本意大概是在祝福世界不要灭亡吧. 在<猩球崛起

python实现汉诺塔方法汇总_python

学习python遇到的第一个问题:汉诺塔问题的实现.首先是不知道什么是汉诺塔问题,然后是不知道怎么实现.于是百度了下,结果如下: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘 方法一: def move(n,a,b,c) # n=2 if n==1 :

c#汉诺塔的递归算法与解析_C#教程

从左到右 A  B  C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 如果有3个盘子, 大中小号, 越小的越在上面, 从上面给盘子按顺序编号 1(小),2(中),3(大), 后面的原理解析引用这里的编号. 小时候玩过这个游戏, 基本上玩到第7个,第8个就很没有耐心玩了,并且操作的动作都几乎相同觉得无聊.  后来学习编程, 认识到递归, 用递归解决汉诺塔的算法也是我除了简单的排序算法后学习到的第一种算法. 至于递归,简单来说

c语言汉诺塔-汉诺塔可以用递归吗 不找规律的话

问题描述 汉诺塔可以用递归吗 不找规律的话 汉诺塔可以用递归吗 不找规律的话 求大神指点 递归应该怎么用才能解决汉诺塔 谢谢了 解决方案 汉诺塔本来就应该用递归,不用递归反倒麻烦,需要用堆栈模拟.http://blog.csdn.net/kkkkkxiaofei/article/details/8333644 解决方案二: #include<stdio.h> void move(int n,char a,char b,char c) { if(n==1) printf("t%c-&g

JavaScript汉诺塔问题解决方法_javascript技巧

本文实例讲述了JavaScript汉诺塔问题解决方法.分享给大家供大家参考.具体实现方法如下: <script language="javascript"> var han=function (disc,src,aux,dst){ if(disc>0){ han(disc-1,src,dst,aux); document.writeln("move disc "+disc+" from "+src+" to "

汉诺塔 python版

汉诺塔问题:如果将n个盘子(由小到大)从a通过b,搬到c,搬运过程中不能出现小盘子在大盘子下面的情况. 思路分析:假设前要移动第100个盘子,分两步走,移动第99个:再移动第100个:而要移动第99个,同样分两部,移动第98个,再移动第99个,以此类推: if(n>1) { 1.先将A柱上的前n-1个盘子从A借助C移动到B; 2.把A柱子上的第n个盘子直接移动到C: 3.再将B柱子上的n-1个盘子借助A移动到C; } 1 #!/usr/bin/python 2 #encoding=utf-8 3