函数的递归调用
一:引入
函数的递归调用:就是在调用一个函数的过程中又直接或间接地调用了自己
示例1:直接调用自己
def foo():
print('hello')
foo()
foo()
示例2:间接的调用自己
def foo():
print('from foo')
bar()
def bar():
print('from bar')
foo()
bar()
为何死递归会抛出异常?
因为无限的递归会导致内存的溢出,所以python设定了最大的递归层数
import sys
print(sys.getrecursionlimit()) #默认1000层
print(sys.getrecursionlimit(2000)) #可以进行更改
所以:不应该无限递归调用下去,应该在满足某种条件下结束递归调用,然后返回
二:递归调用应该分为两个阶段
1.回溯(挖井) :一层一层地递归调用下去
2.递推(从井里往外爬) :在满足某一条件的情况下结束回溯,然后开始向上一层层返回
示范一:
salary(5)=salary(4)+10
salary(4)=salary(3)+10
salary(3)=salary(2)+10
salary(2)=salary(1)+10
salary(1)=18
n=1 salary(n) = 18
n!=1 salary(n) = salary(n-1) + 10
def saraly(n):
if n==1:
return 18
return saraly(n-1)+10
print(saraly(5))
示范二:
nums=[111,[222,[333,[444,[5555,[6666,[777,[888,[9999]]]]]]]]]
def func(num):
for i in num:
if type(i) is list:
func(i)
else:
print(i)
func(nums)
从小到大排列的一个数字列表(二分法)
nums = [11, 13, 32, 47, 53, 73, 84, 91, 101, 111, 222, 333, 444, 5555]
def func(num,lis):
if len(lis)==0:
print('没找到')
return
print(lis)
res=len(lis) // 2
mid_num = lis[res]
if num>mid_num:
right_l=lis[res+1:] 切分
func(num,right_l)
elif num<mid_num:
left_l=lis[ :res]
func(num,left_l)
else:
print('找到了')
func(0,nums) #没找到,最后会二分出一个空括号,由此判断找不到