一、概念:函数内部调用其本身,这个函数就是递归函数
# def calc(n):
# print(n)
# if int(n/2) ==0:
# return n
# return calc(int(n/2))
# calc(10)
# 10 5 2 1
def calc(n):
v = int(n/2)
print(v)
if v > 0:
calc(v)
print(n)
calc(10)
# 5 2 1 0 1 2 5 10
如图所示,函数在进入下一层的时候,当前层的函数并未结束,他必须等它调用的下一层函数执行结束返回后才能继续往下走,
所以最下面的那句print(n)会等最里层的函数执行时才会执行,然后不断往外退层,所以会出现0、1、2、5的效果(虽然我也没搞明白,就这么记好了)
递归特性
1、必须有一个明确的结束条件
2、每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3、递归效率不高,递归层次过多会导致栈溢出
4、递归的用途 - 二分查找 还比如堆排、快排
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
def binary_search(dataset,find_num):
print(dataset)
if len(dataset) > 1:
min = int(len(dataset)/2)
if dataset[min] == find_num:
print('find it',dataset[min])
elif dataset[min] > find_num:
print("find_num is %s 左面" % dataset[min])
print('dataset[0:min] %s' % dataset[0:min])
return binary_search(dataset[0:min],find_num)
else:
print("find_num is %s 右面" % dataset[min])
print('dataset[min+1] %s' % dataset[min+1])
return binary_search(dataset[min+1:],find_num)
else:
if dataset[0] == find_num:
print("find it",dataset[0])
else:
print("要找的数字%s 不在列表" % dataset[0])
binary_search(data,19)