递归函数
理解:一个函数在内部调用自身本身,这个函数就是递归函数。 优点:递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。 递归函数实例: 阶乘:代码: ``` # 阶乘 -递归函数实现 : 例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
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did172670