python中的递归函数

  在一个函数内部,可以调用其他函数,假如一个函数在其内部可以调用自己,那么这个函数就是递归函数。
  在计算数学中的阶乘时,我们常用for循环或者递归函数来实现,例如:
计算9的阶乘:
sum = 0
for i in range(1,10):
    sum *= i
print(sum)

使用递归函数实现:
def me(x):
    if x == 1:
        return x
    return x* me(x-1)
计算5的阶乘:
===> fact(5) ===> 5 * fact(4) ===> 5 * (4 * fact(3)) ===> 5 * (4 * (3 * fact(2))) ===> 5 * (4 * (3 * (2 * fact(1)))) ===> 5 * (4 * (3 * (2 * 1))) ===> 5 * (4 * (3 * 2)) ===> 5 * (4 * 6) ===> 5 * 24 ===> 120

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。比如你输入个1000,他就会提示错误:RuntimeError: maximum recursion depth exceeded in comparison。
而为了防止栈 的溢出;我们可以使用尾递归优化,尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况,尾递归的实现方式是 :使函数本身返回的是函数本身。
使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,任何递归函数都存在栈溢出的问题。递归函数的使用之处有 斐波那契额数列,汉诺塔的移动。

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/qq_37805671/article/details/78685610
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞