• 汉诺塔递归


    #一日一词#

    今天在学习Python的时候,遇到了递归问题,案例呢就是经典的汉诺塔游戏,表示虽然以前就接触过这游戏,解起来也很容易,不过放在编程里,几行的代码可够我手推了一个多小时。╭∩╮(︶︿︶)╭∩╮

    当然也是感受到了搞清楚一个(我认为的)难题的乐趣,心情大好,买条裤子。

    (表示从晚上一直整理到第二天,电脑没电所以今早发,生日与学习紧密结合)​

    首先说下汉诺塔游戏,如下图,需要利用中间的柱子将左边的所有圆盘移动到最右边的柱子上,且和原来的大小上下顺序一致,移动过程中保证大盘永远在小盘下面。

    c,先考虑只有两个圆盘的情况(自行YY),接下来的思路就是把a上的所有圆盘分为两部分,看做只有两个圆盘,一个为最底层大圆盘,另一个为剩余部分,就好解决了;在最大圆盘移到c柱后,就不用考虑这个最大盘,剩余的利用同样的思路进行。

    好,说完游戏,接着说下递归

    递归函数的定义,简单说就是函数在函数内部调用自身作为函数的一部分。

    定义一个计算阶乘的函数,n!=n*(n-1)!,然后(n-1)!=(n-1)*(n-2)!,以此类推,编写函数(Python语言,def是定义函数的开头):

    def fact(n):

        if n==1:

            return 1

        return n * fact(n - 1)

    这里就是计算:

    n*fact(n-1)=n*(n-1)*fact(n-2)=…

    这就是递归,自己调用自己,类似循环的东西。这里就不多叙述,重点是下面的东西。

    用递归函数解汉诺塔:代码很少,利用几行递归和简单思路,却能把任绕进去。不废话,上代码。

    先提前提醒,接下来的过程中一定要分清形参和实参

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

        if n ==1:

            print a,'-->', c

            return

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

        print a,'-->', c

    这里定义了一个move函数,用以返回汉诺塔游戏的步骤,参数(n,a,b,c)分别指最左边的柱子上有n个圆盘(一次放好的)、左边的柱子a、中间的柱子b,右边的柱子c。表示a柱上有n个圆盘,通过b柱,移动到c柱。

    先分析一下,第一部分的判断,即:假如n=1,表示只有一个圆盘,则输出“a-->c”,即一步到位。

    第二部分:递归部分。如果n>1,则调用move函数,将n-1个圆盘从a柱先移到b柱上去,调用一个递归,在这个n-1的递归完成后(这句话很重要),再将a柱上剩下的最大盘移动到c柱,即输出“a-->c”,剩余的进行递归,这时n-1个盘全部在b柱上,因此需要将n-1个盘移动c柱上,即move(n-1,b,a,c)。剩下的步骤就回到最初的起点,呆呆的站在柱子前。。。。

    这里的分析基本上只有两步,多了怕把你绕进去。同时在分析过程中始终理清形参与实参。

    接下来咱们实际操作,先简单的:move(3,D,E,F)

    首先第一步,判断:n>1,则下一步:

    这描述够详细了

    接下来咱们就一步一步来推算。

    第一步:

    以上是第一步,注意,这时不应该输出任何东西,虽然有“print D,”-->”,F”,但这不是我们的第一步,第一步是“move(2,D,F,E)”,所以应继续计算“move(2,D,F,E)”,这里做个标记X1,表明还有两行代码未执行,接下来计算“move(2,D,F,E)”:

    这里是针对X1步骤里的递归,但是还没结束,因为还有个递归“move (1,D,E,F)”,这里我们标记X2表明这里还有两行代码未执行,而且有一个递归。

    接下来是执行X2里的递归,“move (1,D,E,F)”:

    到这里,我们第一步里的最里层的递归就结束了,我们标记为X3所以这X3所输出的结果才是整个过程的第一步

    到这里,我们完成了X2里的第一行递归代码(就是X3),可以回到X2继续执行,及X2剩余的两行代码,

    到这里,X3X2就完成了,这时我们已经得到三步,回到X1,接着完成X1剩下两行代码:

    到这里就只剩下move(2,E,D,F)这个递归了。

    到此,整个递归就结束了,整合步骤:

    D-->F

    D-->E

    F-->E

    D-->F

    E-->D

    E-->F

    D-->F

    以及代码验证结果(这里是在PYCharm环境下编写):

    最后附我的手推过程:(能看懂的话)

  • 相关阅读:
    Maven------使用maven新建web项目出现问题 项目名称出现红色交叉
    Strut2------获取界面返回的session,application,parameter
    js之可迭代对象
    js字符串
    js之strict模式
    js系列之js简介
    python私有成员
    python之偏函数
    python之装饰器
    python之匿名函数
  • 原文地址:https://www.cnblogs.com/rhongp/p/6383873.html
Copyright © 2020-2023  润新知