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

参考文章: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‘)

函数作为参数直接调用

时间: 2024-10-06 02:52:15

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

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

//Li Cuiyun,October 14,2016.//用递归方法编程解决汉诺塔问题package tutorial_3_5;import java.util.*; public class HanoiTower { public static void main(String[] args) { // TODO Auto-generated method stub @SuppressWarnings("resource") Scanner sc=new Scanner(Syste

【算法题】06-用栈来解决汉诺塔问题

用栈来解决汉诺塔问题 题目 修改汉诺塔问题的游戏规则:限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间.求当塔有N层的时候,打印最优移动和最优移动总步数. 要求: 方法一:递归的方法 方法二:非递归的方法,用栈来模拟汉诺塔的三个塔 思路 方法一:递归的方法 首先,如果只剩最上层的塔需要移动,则有如下处理: 如果希望从左移动到右,打印Move 1 from left to right 如果希望从中移动到左,打印Move 1 from mid to left 如

【Python实践-3】汉诺塔问题递归求解

1 # -*- coding: utf-8 -*- 2 #汉诺塔移动问题 3 # 定义move(n,a,b,c)函数,接受参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量 4 # 然后打印出把所有盘子从A借助B移动到C的方法 5 def move(n,a,b,c): 6 if n==1: 7 print('move', a, '-->', c) 8 else: 9 move(n-1,a,c,b) 10 move(1,a,b,c) 11 move(n-1,b,a,c) 12 move(5,'

Python函数递归之汉诺塔

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上. 并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 汉诺塔的移动问题,汉诺塔的三个圆柱分别标注为A.B.C,圆盘开始是在A圆柱上面并上从下往上按照大小顺序摞着圆盘,需要将其移动到 C圆柱,递归的思路是: (1)A上的的圆盘个数n = 1,那么很直接,直

Python 实现递归算法之汉诺塔

如图的小游戏,汉诺塔: 游戏的目的是将最左边的三块移动到最右边,游戏即为成功. 下面按照代码的步骤进行移动,三根柱子分别代表了x,y,z: 发现可以实现游戏目的! 当然,三个对于很多人来说并不难实现目标,但是当块变成了5个甚至8个呢 下面,我们来试试7个方块,同样是三根柱子,人的计算就很难实现游戏目标了 所以我们用代码来试试: 可以看到非常长,所以我来按照他的指示来进行游戏 游戏成功! 总共有128步操作,如果人为的来进行游戏的话,很有可能会出错. 所以在此运用了递归算法,编写递归函数来教我们如

栈解决汉诺塔问题

汉诺塔问题比较经典,这里修改--下游戏规则: 现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间. 求当塔有N层的时候,打印最优移动过程和最优移动总步数. 在走出最少步数过程中的任何时刻,四个动作中只有一个动作不违反小压大和相邻不可逆原则(相邻的两次操作不互为逆操作如:MtoR和RtoM),另外三个动作一定都会违反. #include <iostream> #include <stack> using namespace std; enum

C#递归解决汉诺塔问题(Hanoi)

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExample_Hanoi_{    class Program    {        static void Main(string[] args)        {            HanoiCalculator c = new HanoiCalculator();            Cons

递归解决汉诺塔问题

汉诺塔问题:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,求至少需要多少次移动. 我们首先假设n=1,那么move(n)=1,因为这时候只需要从A->C便可以.接下来假设n=2,那么move(n)=3 即A->B,A->C,B->C; 假设n=3,move(n)=7 即A->C,A->b,C->B,A->C,B->A,B-

python练习-递归函数实现汉诺塔搬迁问题

def move(n,a='A',b='B',c='C'): if n==1: print('move',a,'to',c) else: move(n-1,a,c,b)#将A上的n-1块通过c搬运到b上 print('move',a,'to',c)#将A最下面的那一块搬到C上 move(n-1,b,a,c)#将b的n-1块通过a搬到c上,结束 输入: move(10),运行结果如下: