• 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怎么完成任务,只需要和我做同样的事情就可以了。

  • 相关阅读:
    C语言练习之计算某年日是该年的第几天
    C语言练习之 猴子吃桃问题
    C语言练习之 求阶乘
    C语言学习(四)
    C语言学习(三)
    C语言学习(二)
    C语言学习(一)
    自定义函数汇总
    #2019121200026 最大子序列和
    #2019121000025-LGTD
  • 原文地址:https://www.cnblogs.com/xkxf/p/6396886.html
Copyright © 2020-2023  润新知