一、递归调用解析
1、什么是递归调用
即就是说在调用一个函数的过程中,函数内部又调用另一个函数,而函数的递归调用指的是在调用一个函数的过程中又直接或间接地调用该函数本身。
# 直接
def foo():
print('hhh')
foo()
foo()
# 间接
def dar():
print('hhh')
foo()
def foo():
print('哈哈哈')
dar()
foo()
2、死递归
死递归类似于死循环,调用函数出现的死循环问题。
为什么会死递归:
它是Python的一种保护措施,无限递归会导致内存溢出。
# 了解
import sys # 导入sys模块
print(sys.getrecursionlimit()) # 查看递归最大层数
print(sys.setrecursionlimit(1000)) # 设置最大层数
所以不应该让它无限进行下去应该满足某个条件结束。
3、递归调用两个阶段
回溯: 一层一层的递归调用下去
递推: 在满足某一条件结束回溯,然后一层一层返回
有趣的小例子帮助理解:
例:有五个同学,第一个同学小明说自己比下一个同学小红大十岁,小红说我比下一个同学大十岁…
最后一位同学说自己18,这时就可以运用递归知识进行推理如下;
def salary(n):
if n == 1:
return 18
return salary(n - 1) + 10
res = salary(5)
print(res)
4、案例
# 算法之二分法
nums = [11, 13, 32, 47, 53, 73, 84, 91]
def foo(l, num):
m_index = len(l) // 2
if num > l[m_index]:
r = l[m_index + 1:]
foo(r, num)
elif num < l[m_index]:
l1=l[:m_index]
foo(l1,num)
else:
print('找到')
foo(nums, 53)
## 从小到大排列的一个数字列表
nums = [11, 13, 32, 47, 53, 73, 84, 91,101,111,222,333,444,5555]
def binary_search(l,find_num):
print(l)
if len(l) == 0:
print('find_num not exists')
return
mid_index = len(l) // 2
if find_num > l[mid_index]:
right_l=l[mid_index+1:]
binary_search(right_l,find_num)
elif find_num < l[mid_index]:
left_l=l[:mid_index]
binary_search(left_l,find_num)
else:
print('find it')
binary_search(nums,85)
# 取嵌套列表值
nums=[111,[222,[333,[444,[5555,[6666,[777,[888,[9999]]]]]]]]]
def func(l):
for x in l:
if type(x) is list:
# 把自身的代码重新再调用一次
func(x)
else:
print(x)
func(nums)