基础概念
递归:在函数内部调用自身
递归与迭代的相同:都是一种函数的不断循环,每循环一次,减少一次解决问题的规模
不同:1.递归利用了栈的先进后出的概念,即将第一次运行的结果放入栈底,最后一次递归的结果放入栈顶,
再根据需要依次从栈顶取结果进行运算
2.递归:我们并不知道递归的次数,只需要规定递归结束的条件
迭代:有一个确切的迭代次数,并且迭代完成自动停止
递归 二分法
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用
栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
#用循环实现阶乘
# j = 1
# n = int(input('n>>:'))
# while n != 1:
# j *= n
# n -= 1
# print(j)
#用递归实现阶乘
# def jiecheng(n):
# if n == 1:
# return n
# return n*jiecheng(n-1)
# print(jiecheng(5))
#递归问年龄的问题:
# def age(n):
# if n == 1:
# return 10
# else:
# return age(n-1)+2
#函数第一次的运行结果依赖第二次运行的结果,只有得到最后一次的运行结果,才能返回递归函数的结果
#从以下列表中找到特定的某个值,
# 当列表无穷大时,使用循环占内存,使用迭代效率低,这时就可以使用递归函数,极大的提高查找效率
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
def search(num,data):
print(data)
if len(data) > 1:
if num > data[len(data)//2]:
return search(num,data[len(data)//2:])
elif num < data[len(data)//2]:
return search(num,data[:len(data)//2])
else:
print('find')
return '结果'
else:
if num == data[0]:
print('find it')
else:
print('no exit')
print(search(19,data))
#若最后递归的结果要逐步往回返,函数每次递归的结果都要写return值,因为每次函数运行依赖下次运行的结果
#若最后递归的结果正是函数想要的结果,则不需要写return值