python中的递归函数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37805671/article/details/78685610
  在一个函数内部,可以调用其他函数,假如一个函数在其内部可以调用自己,那么这个函数就是递归函数。
  在计算数学中的阶乘时,我们常用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解释器也没有做优化,任何递归函数都存在栈溢出的问题。递归函数的使用之处有 斐波那契额数列,汉诺塔的移动。

展开阅读全文

没有更多推荐了,返回首页