Python递归函数
函数的执行流程
如下函数调用存在创建栈针、print函数压栈、字符串变量压栈调用函数、弹出栈顶、返回值
def foo1(b,b1=3): print("foo1 called",b,b1) def foo2(c): foo3(c) print("foo2 called",c) def foo3(d): print("foo3 called",d) def main(): print("main called") foo1(100,101) foo2(200) print("main ending") main()
递归
函数直接或间接调用自身就是递归,递归需要有边界条件,递归前进段、递归返回段;递归一定要有边界条件,当边界条件不满足时,递归前进段,当递归条件满足时,递归返回。
求斐波那契数列第n项:
循环实现
a = 0 b = 1 n = 10 for x in range(n): a,b = b,a+b print(a)
def fib(n,a=0,b=1): for x in range(n-1): a,b=b,b+a return a fib(10)def fib(n,a=0,b=1): for x in range(n): a,b=b,b+a return b #在不确定边界的时候将a/b返回 def fib(n,a=0,b=1): for x in range(n-1): a,b=b,b+a return a,b
递归要求
一定要有退出条件,没有退出条件就是无限递归,递归的深度不宜太深,Python对递归函数有限制,以保护解释器,超过最大深度则抛出异常:RecursionError
import sys
sys.getrecursionlimit() #能返回最大递归次数
函数反复压栈,栈内存会很快溢出,避免递归深度太深,如没有退出条件则无限递归。
def fib3(n,a=0,b=1): a,b = b,a+b return a if n < 2 else fib3(n-1,a,b) def fib3(n,a=0,b=1): return b if n < 2 else fib3(n-1,a=b,b=a+b)
递归实现:
def fib1(n,a=0,b=1): if n < 3: return 1 return fib1(n-1) + fib1(n-2)
三元表达式实现:
def fib2(n,a=0,b=1): return 1 if n < 3 else fib2(n-1) + fib2(n-2) fib2(10)
使用lru_cache,空间换时间
import functools @functools.lru_cache() def fib(n): return 1 if n < 3 else fib(n-1) + fib(n-2) print(fib(101)) 573147844013817084101

浙公网安备 33010602011771号