码迷,mamicode.com
首页 > 编程语言 > 详细

Python11 递归函数

时间:2019-08-21 23:00:59      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:多少   ack   解释   cto   栈帧   参数   参数类型   typeerror   href   

递归函数

  • 理解:一个函数在内部调用自身本身,这个函数就是递归函数。
  • 优点:递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
  • 递归函数实例:
    • 阶乘
      • 代码:
        ```
        # 阶乘 -递归函数实现 : 例3的阶乘: 1 * 1 * 2 * 3
        def factorial(x):
        if not isinstance(x,(int)) or x < 0 : # 校验参数类型必须是正整数或者是0
        raise TypeError("参数x类型必须是正整数")
        elif x == 0:
        return 1 # 0的阶乘是1
        else:
        return x * factorial(x-1)
        # 分解 return x * factorial(x-1)
        # x = 3 时, 结果是 3 * factorial(3-1)(即x=2)
        # x = 2 时,结果是 2 * factorial(2-1) (即x=1)
        # x = 1 时,结果是 1 * factorial(1-1) (即x=3)
        # x = 0 时,结果是 1
        # 最后结果 3 * 2 * 1 * 1
        print(factorial(3))

        ```
      • 运行结果:
        技术图片
      • 栈溢出:在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出
        • 栈溢出实例:
          技术图片
        • 解决方法:尾递归优化尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
        • 尾递归优化实例:https://www.liaoxuefeng.com/wiki/1016959663602400/1017268131039072

Python11 递归函数

标签:多少   ack   解释   cto   栈帧   参数   参数类型   typeerror   href   

原文地址:https://www.cnblogs.com/thloveyl/p/11391735.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!