递归
递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用
def count(n):
print(n)
count(n+1)
count(0)
调用函数会产生局部的名称空间,占用内存,因为上述这种调用会无需调用本身,python解释器的内存管理机制为了防止其无限制占用内存,对函数的递归调用做了最大的层级限制
可以修改递归最大深度
import sys
sys.getrecursionlimit()
sys.setrecursionlimit(2000)
def num(n):
print('from num',n)
num(n+1)
num(1)
# 虽然可以设置,但是因为不是尾递归,仍然要保存栈,内存固定,不可能无限递归
# 递归应该分为两个明确的阶段,回溯与递推
递归的总结:
- 必须有一个明确的结束条件
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
- 递归的效率不高,次数过多,可能导致栈溢出
案例:一个数递归除2
def calc(n):
s = int(n/2)
print(s)
if s == 0:
return 'Done' # return函数结束
calc(s) # 递归
calc(10)
02.求阶乘 n! = 1x2x3x4..xn
def mult(n):
if n == 1:
return 1
return n * mult(n-1)
print(mult(4))