• pyDay5


    内容来自廖雪峰的官方网站

    1、递归函数的优点是定义简单,逻辑清晰。

    2、使用递归函数需要注意防止栈溢出。

    3、在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。

    4、由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。例如调用 fact(1000)会出现:

    RecursionError: maximum recursion depth exceeded in comparison 递归错误:超过最大递归深度

    5、解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,

    所以,把循环看成是一种特殊的尾递归函数也是可以的,

    原理:递归本身无论调用多少次,都只占用一个栈帧。

    6、大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。

    练习

    汉诺塔:有三根相邻的柱子,标号为A、B、C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子C上,并且每次移动,同一根柱子上都不能出现大盘子在小盘子上方。

    def move(n, a, b, c):
        # 递归边界 
        if n==1:
            print(a,'-->',c)
            return None
        # 手下1
        move(n-1, a, c, b);
        # 自己动手
        print(a, '-->', c);
        # 手下2
        move(n-1, b, a, c);

    递归本身就是为了方便人脑思维的。递归的思维方式就是:某人需要完成某一件事情,只需要委托另一个人(或者几个)完成一些事情,而另一个人只需要和委托者做相同的事情,最终就可以完成这件事情。例如我需要把n个不同大小的原盘从A移动到C,最简单的方式就是:先叫手下1把n-1个圆盘移动到B(不关注他是如何移的),然后由我自己把A盘剩下的1个圆盘移动到C,最后再叫手下2把n-1个圆盘从B移动到C。至于手下1和手下2怎么完成任务,只需要和我做同样的事情就可以了。

  • 相关阅读:
    Tuning 14 Using Oracle Data Storage Structures Efficiently
    Tuning 13 Using oracle blocks Efficiently
    Tuning 12 manage statistics
    Tuning SQL 11
    【TYVJ】1307 联络员(最小生成树)
    【wikioi】1022 覆盖(匈牙利)
    【TYVJ】1338 QQ农场(最大流+最大权闭合图)
    【BZOJ】3038: 上帝造题的七分钟2(线段树+暴力)
    【BZOJ】1087: [SCOI2005]互不侵犯King(状压dp)
    【BZOJ】1041: [HAOI2008]圆上的整点(几何)
  • 原文地址:https://www.cnblogs.com/xkxf/p/6396886.html
Copyright © 2020-2023  润新知