精华内容
下载资源
问答
  • python实现汉诺塔递归算法经典案例来源:中文源码网浏览: 次日期:2018年9月2日【下载文档:python实现汉诺塔递归算法经典案例.txt】(友情提示:右键点上行txt文档名->目标另存为)python实现汉诺塔递归算法经典...

    python实现汉诺塔递归算法经典案例

    来源:中文源码网    浏览: 次    日期:2018年9月2日

    【下载文档:  python实现汉诺塔递归算法经典案例.txt 】

    (友情提示:右键点上行txt文档名->目标另存为)

    python实现汉诺塔递归算法经典案例 学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,所以本人觉得可以写篇博客来表达一下自己的见解。这markdown编辑器还不怎么会用,可能写的有点格式有点丑啦,各位看官多多见谅.

    网上找了一张汉诺塔的图片,汉诺塔就是利用用中间的柱子把最左边的柱子上的圆盘依次从大到小叠上去,说白了就是c要跟原来的a一样 废话少说,先亮代码

    def move(n, a, buffer, c):

    if(n == 1):

    print(a,"->",c)

    return

    move(n-1, a, c, buffer)

    move(1, a, buffer, c)

    move(n-1, buffer, a, c)

    move(3, "a", "b", "c")  首先是定义了一个移动的函数,四个参数分别代表,a柱上的盘子个数,buffer也就是b柱,命名为buffer便于理解,顾名思义就是一个a移动到c的缓冲区.然后c就是目标柱子

    下面我们来读函数代码

    递归的一般写法,肯定有个中止递归循环的条件,所以在判断a柱上的盘子个数为1的时候既可以中止递归并返回,a柱上面只有一个的时候肯定就是把a移动到c了,重点是下面的代码,递归其实是一种很抽象的算法,我们要利用抽象思维去想汉诺塔这个问题,把a柱上的盘子想成两份,就是上面的盘子和最底下的盘子,如果所示  我们不关心上面的盘子到底有几个,我们每次的操作就是把最底下的盘子通过缓冲区 b柱 buffer 移动到c柱。

    童鞋们肯定在想为啥要酱紫移动呢,其实这是一种总结归纳吧,你自己玩一下汉诺塔游戏就会发现规律,其实这个游戏就是不停的把上面的所有的想方设法的移到b上,然后把a最后最大的那个弄到c,然后再绞尽脑汁的把b上的移动到c,这时候你就发现,原来b上的也要先通过空的也就是a来存放当前b上面的n-1个,然后把b的最大最后的移动到c,这里规律就体现出来了,也可以抽象出移动的方法,并可以以此设计出程序算法.  以下我们来利用刚才的抽象思维解读剩余代码

    move(n-1, a, c, buffer)

    这段代码就是表示把刚才所说的a柱的上面的n-1个,通过c按照从小到大的规则先移动到缓冲区buffer。此函数进入递归。

    move(1, a, buffer, c)

    当上面的语句执行完成,也就是n-1个盘子的递归移动完成之后,执行此语句,就是把a柱上的一个盘子移动到c,也就是所谓的最底下的盘子

    move(n-1, buffer , a, c)

    最后一步,就是刚才把a上面的n-1个都移动到了buffer上面,肯定要通过a移动到c才能完成整个汉诺塔的移动啊,于是最后一步自然是把刚才的n-1个通过a当缓冲区移动到c柱上.

    我来写下整个移动流程,以a柱上有3个为例子

    /**

    我把3个盘子的汉诺塔全部通过代码演示,按缩进原则,每一个缩进即进一个递归函数,每打印一次即中止当前递归,也就是每个print

    说明:

    1.n = 3, n = 2, n = 1是每次执行if(n == 1)的结果,这里就不写判断了,相信童鞋们也能看懂,也就是n不等与1时就减1进入递归

    2.请注意a,b,c柱每次进入函数的顺序,不要被形参带错路了,看准每次函数参数的实参

    **/

    move(3, "a", "b", "c")

    n=3:

    //开始从a上移动n-1即2个盘子通过c移动到b,以腾出c供a最后一个盘子移动

    move(2, "a","c","b")

    n=2:

    //开始进行n=2的一个递归,把当前a('a')柱上的n-1个盘子通过c('b')移动到b('c')

    move(1, "a", "b", "c")

    n=1:

    //n=2的第一个递归完成,打印结果,执行当前子函数剩余代码

    print("a", "->", "c")

    move(1, "a", "c", "b")

    n=1:

    print("a", "->", "b")

    move(1, "c", "a", "b")

    n=1:

    print("c", "->", "b")

    //到这里完成了a柱上面的n-1即是2个盘子的移动

    //开始把a柱上最后一个盘子移动到c柱上

    move(1, "a", "b", "c")

    n=1:

    print("a", "->", "c")

    //到这里完成移动a柱上的最后一个盘子到c柱上

    move(2, "b", "a", "c")

    n=2:

    //开始进行n=2的第二个递归,即把当前b('b')的盘子(n-1个)通过a('a')移动到c('c')上

    move(1, "b", "c", "a")

    n=1:

    //n=2 的第二个递归完成,打印结果并执行当前子函数的剩余代码

    print("b", "->", "a")

    move(1, "b", "a", "c")

    n=1:

    print("b", "->", "c")

    move(1, "a", "b", "c")

    n=1:

    print("a", "->", "c")

    //到这里把b上的盘子通过a移动到c,

    //整个代码执行完毕,汉诺塔移动完成最后的打印结果为: 童鞋们理解了汉诺塔的递归算法原理后,可以写个程序来试试,这里只是学到Python的递归所以用了Python,童鞋们可以用其他语言实现,汉诺塔确实能帮助理解递归原理,递归在程序设计中的重要性不言而喻啦!

    亲,试试微信扫码分享本页! *^_^*

    展开全文
  • 汉诺塔 递归

    2020-08-16 09:28:58
    汉诺塔递归算法 数学描述 从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤...

    汉诺塔递归算法

    数学描述
    从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数
    算法分析
    求解汉诺塔问题最简单的算法还是通过递归来求。

       实现这个算法可以简单分为三个步骤:
    

    (1) 把n-1个盘子由A 移到 B,把A上n-1个盘子通过借助辅助塔(C塔)移到了B上,

    (2) 把第n个盘子由 A移到 C,是把最大的一个盘子由A移到C上去;

    (3) 把n-1个盘子由B 移到 C,把B上n-1个盘子通过借助辅助塔(A塔)移到了C上;
    代码实现

    public class Hanoilmpl {
     
        public static void hanoi(int n, char A, char B, char C) {
            if (n == 1) {
                move(A, C);
            } else {
                hanoi(n - 1, A, C, B);//将n-1个盘子由A经过C移动到B
                move(A, C);             //执行最大盘子n移动
                hanoi(n - 1, B, A, C);//剩下的n-1盘子,由B经过A移动到C
            }
        }
     
        private static void move(char A, char C) {//执行最大盘子n的从A-C的移动
            System.out.println("move:" + A + "--->" + C);
        }
     
        public static void main(String[] args) {
            System.out.println("移动汉诺塔的步骤:");
            hanoi(3, 'a', 'b', 'c');
        }
    }
    
    展开全文
  • 汉诺塔递归

    2020-04-14 10:47:37
    #汉诺塔递归 def hanoi(n, A, B, C): if n > 0: hanoi(n-1, A, C, B)#n-1个盘子,借C柱子移动到 B print('%s->%s' % (A, C))#第N个盘子A移动到C hanoi(n-1, B, A, C)#n-1个盘子,借C柱子移动到 B # h(n) ...
    #汉诺塔递归
    
    def hanoi(n, A, B, C):
        if n > 0:
            hanoi(n-1, A, C, B)#n-1个盘子,借C柱子移动到 B
            print('%s->%s' % (A, C))#第N个盘子A移动到C
            hanoi(n-1, B, A, C)#n-1个盘子,借C柱子移动到 B
    
    
    # h(n) = 2h(n-1)+1
    
    hanoi(64, 'A', 'B', 'C')
    
    展开全文
  • 汉诺塔递归算法&分析过程汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把...

    汉诺塔递归算法&分析过程

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

    不管这个传说的可信度有多大,如果考虑一下把64片黄金圆盘,由一根柱子上移到另一根柱子上,并且始终保持上小下大的顺序。这需要多少次移动呢?。1个的时候当然是1次,2个的时候是3次,3个的时候就用了7次......这实在是太累了。这里需要递归的方法。假设有n片,移动次数是f(n).显然

    f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2f(k)+1。此后不难证明f(n)=2^n-1。

    n=64时,

    假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下:

    18446744073709551615秒

    这表明移完这些黄金圆盘需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

    汉诺塔问题在数学界有很高的研究价值,而且至今还在被一些数学家们所研究,也是我们所喜欢玩的一种益智游戏,它可以帮助开发智力,激发我们的思维。

    之前看到了一段经典的递归代码,简简单单几行代码就解决了深奥的问题,为什么那几行代码就把汉诺塔问题给解了呢?

    代码如下:

    看到这个程序 ,难理解的就是下面两句:

    move(n-1, a, c, b)

    move(n-1, b, a, c)

    我们知道它用了递归,第一句把第一个位置的盘移到第二个位置,第二句再把第二个移到第三个位置。 但为什么这样就可以递归出答案呢?

    这个可以用二叉树解释。下面看一个图估计你就会知道了。

    这是一个递归的图解,根结点是第一次进入move函数,第一个参数3只要大于1就往下推,第二个参数是指要移动的盘的原始位置,第四个参数是指要移动到的目的位置,第三个参数中转,下一次递归时准备的一个参数。这个图是按照程序画出来的,上面的节点个数就是调用move函数的次数。现在我们来中序遍历这棵二叉树。

    假设:开始时a,b,c三个盘都放在one上,从a到c依次增大,就是说c放在最下面,a在最上面,-> 表示移动。

    节点4:a -> z

    节点2:b -> y

    节点5:a -> y

    节点1:c -> z

    节点6:a -> x

    节点3:b -> z

    节点7:a -> z

    完成。

    假设有4个盘呢?那也是一样的道理可以推出。这时就有15个节点,就是说要移动15次。那有n个盘呢?2的n次方减1……

    展开全文
  • 1 /*汉诺塔递归2 * 1.将编号0-N-1个圆盘,从A塔座移动到B上面3 * 2.将编号N的1个圆盘,从A移动到C上面4 * 3.最后将B上面的N-1个圆盘移动到C上面5 * 注意:盘子的编号从上到下1-N6 **/7 public classHannoTower_...
  • 如何实现java汉诺塔递归算法Java是一门面向对象编程语言,不仅吸收了C++语言的`各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。以下是小编为大家搜索整理的...
  • 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从...
  • 在刚学廖雪峰廖大佬的python3教程中的递归时,前面的内容理解都觉得还行,到了做汉诺塔的练习时会觉得有些发懵,后面多看几遍和练习后也就理解了。因为遇到有人在问这个问题咋理解,因此写下我的想法,希望能帮助到...
  • 汉诺塔递归算法

    2016-01-22 17:05:00
    汉诺塔 递归
  • 主要大家分享了python实现汉诺塔递归算法经典案例,感兴趣的小伙伴们可以参考一下
  • mfc实现汉诺塔递归

    2019-11-01 14:50:00
    mfc实现汉诺塔递归 1、编程要求 1)刚开始时,缺省三根针,三(多)层金盘位于第一根针上。 2)按“开始”菜单演示汉诺塔移动过程,按“结束”菜单结束汉诺塔演示过程。 3)在客户区正确显示当前移动图示过程。 4)在...
  • 汉诺塔介绍汉诺塔简单介绍:有三根相邻的柱子,假定从左到右为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子...
  • 汉诺塔递归调用(C语言实现)

    万次阅读 多人点赞 2018-11-03 14:17:09
    1.递归算法 递归算法:是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。 递归过程一般通过函数或子过程来实现。 递归算法...
  • 汉诺塔 递归算法

    2017-11-09 19:27:08
    汉诺塔递归算法
  • c语言汉诺塔递归算法

    2020-04-07 10:44:57
    c语言汉诺塔递归算法详细解释,图文并茂
  • 汉诺塔递归与非递归实现 背景介绍 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天...
  • 汉诺塔递归与非递归结果对比,结果是no differences,说明非递归算法没错。递归算法参考了csdn另一名博主的博客。
  • 汉诺塔递归代码

    2019-09-30 10:14:43
    汉诺塔递归代码汉诺塔代码理解 汉诺塔 今天发现写的代码还是记一下,不然极易忘记,真的蛋疼。 代码 #include<iostream> using namespace std; void move(char a,char b,char c,int n); int main() { int n; ...
  • Java:汉诺塔递归

    2018-12-16 01:04:45
    汉诺塔递归次数为2^n-1,当n越大时所要移动的次数成指数急速增长 package 方法递归; public class 汉诺塔递归 { public static void main(String[] args) { f(3,"A","B","C"); ...
  • 汉诺塔递归习代码

    2012-03-11 17:28:08
    习语言实现的汉诺塔递归例程,中文编程也是不错的嘛。
  • 汉诺塔递归算法/搬金盘的婆罗门 - Python实现版权声明本文节选自作者本人的图书《Python编程基础及应用》,高等教育出版社。本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的...
  • 汉诺塔递归解法

    2019-12-13 17:55:41
    汉诺塔递归解法例子代码 例子 ………… 代码 <form action="#" method="post"> 请输入有多少个盘子:<input type="text" id="ge" name="ge" /> <input type="submit" value="确认"/> ...
  • 汉诺塔递归问题(C语言)

    多人点赞 2021-04-18 16:05:24
    汉诺塔递归问题(C语言)问题由来问题分解原代码运行结果重要步骤感悟 问题由来 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上...
  • 汉诺塔递归实现

    万次阅读 2017-11-22 21:36:50
    #include &lt;iostream&gt;using namespace std;int main(){ int n; void hannuo(int n,char x,...汉诺塔递归实现"&lt;&lt;endl; cin&gt;&gt;n; hannuo(n,'A','B','C'); retur...
  • 汉诺塔 递归 c++

    2020-09-08 19:55:53
    汉诺塔 递归 c++ 1.递归终止条件:没有安排好的盘子只剩一个。此时将其从A,放到C 2.子问题:先将n-1个盘子从A经过中转站C放到B,再将n-1个盘子从B经中转站A放到C。 3.cout的是从出发点到中转站,n=1时cout从出发点到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,312
精华内容 2,924
关键字:

汉诺塔递归