递归函数相关
递归函数
递归函数是指函数间接或者直接的调用了函数自身。
# 直接调用函数本身
def index():
print('from index')
index()
index()
# 间接调用函数
def index():
print('from index')
func()
def func():
print('from func')
index()
index()
我们尝试运行一下,发现在运行了一段时间会报错,这是python对我们内存的保护措施。官方提供的最大递归深度为1000左右,防止我们无线的递归导致内存溢出。
所以在使用递归时,我们应该设置让递归停下来的点。
def index(n):
if n == 1:
return 1
return index(n-1) * n
res = index(5)
print(res) # 120
递归实际上有两个过程,先是向下传递,停止递之后是向上回溯,就拿上面的例子来理解。
向下递:
index(5)传入实参5,走index(n-1)*n
的分支,将5代入n,即index(4)*5
index(4)传入实参4,走分支,得到index(3)*4
index(3)传入实参3,得到index(2)*3
index(2)传入实参2,得到index(1)*2
index(1)传入实参1,判断走return 1的分支,拿到了返回值1
向上归:
index(1)在index(2)的函数体中,把index(1)*2
做返回值,将index(1)的返回值代入index(1),
得到1*2,所以index(2)的返回值是2
index(2)的返回值,表达式为 index(2) = index(1)*2
,
index(3)的返回值 index(3) = index(2)*3 = index(1)*2*3
index(4)的返回值 index(4) = index(3)*4 = index(1)*2*3*4
index(5)的返回值 index(5) = index(4)*5 = index(1)*2*3*4*5
所以index(n)的返回值最终取决于递归终点的返回值index(1),我们代入index(1) = 1
得到index(5) = 1x2x3x4x5 =120
练习
# 利用递归函数依次打印列表中每一个数据值
l1 = [1, [2, [3, [4, [5, [6, [7, [8, ]]]]]]]]
def search_num(list_tree):
for i in list_tree:
if type(i) is list: # 判断数据类型是否为列表
search_num(i) # 如果是列表则递归打印
else:
print(i)
search_num(l1)