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

 

posted @ 2020-04-17 10:46  Alrenn  阅读(178)  评论(0)    收藏  举报