一、首先了解下,函数的嵌套调用
def func1(): print('from func1') func1() func1()
此例子,递归调用没有结束条件,进入死循环。但python对它做了层级限制,不会进入死循环,避免内存溢出。
函数递归调用:在调用一个函数的过程中直接或间接地调用该函数本身,称之为函数的递归调用。
n=1 def func1(): global n print('from func1',n) n+=1 func1() func1()
此例子可以看执行了多少次!
import sys print(sys.getrecursionlimit())
python本身的层级限制(默认1000),这个值可以修改
import sys print(sys.getrecursionlimit()) sys.setrecursionlimit(2000) n=1 def func1(): global n print('from func1',n) n+=1 func1() func1()
继续下面例子:
def func(): print('from func') bar() def bar(): func() func()
==
def func(): print('from func') func() func()
二、递归定义
递归分为两个重要的阶段:递推+回溯
设计思路: age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=18 n!=1 #age(n)=age(n-1)+2 n=1 #age(n)=18
def age(n): if n == 1: res=18 return res res=age(n-1)+2 #res=age(4)+2:age5等这一步的结果 return res print(age(5))
return 的作用是:返回值,结束当前调用。
进入下一次递归前,保存上一次递归结果,所以递归的效率不高!
总结递归调用: 1:进入下一次递归时,问题的规模必须降低 2:递归调用必须要有一个明确的结束条件 3:在python中没有尾递归优化,递归调用的效率就是不高
实战一、
def bar(): import time time.sleep(3) return 4 def foo(): res=bar()+3 return res print(foo()) 这里也可以写成: def foo(): return bar()+3 先执行retrun后面代码,再返回值!
实战二:
l=[1,2,[3,[4,[5,[6,7,[8,9,[10,[11,[12]]]]]]]]] def get(l): for item in l: if isinstance(item,list): get(item) else: print(item) get(l)
也可以写成: if type(item) is list:
1、满足条件结束递归;
2、满足条件进入下一次递归。