递归函数
- 理解:一个函数在内部调用自身本身,这个函数就是递归函数。
- 优点:递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
- 递归函数实例:
- 阶乘:
- 代码:
```
# 阶乘 -递归函数实现 : 例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
- 栈溢出实例:
- 代码:
- 阶乘:
原文地址:https://www.cnblogs.com/thloveyl/p/11391735.html
时间: 2024-11-01 22:55:05