12. 函数递归与二分法
函数递归
递归是函数嵌套使用的一种特殊情况,本质上就是在调用一个函数的过程中直接或间接的调用其本身
递归的本质就是循环,所以当需要重复执行代码的时候使用递归
# 一、递归的两种形式:
# 1.直接调用本身
def f1():
print('是我是我还是我,想不到吧')
f1()
f1()
# 2.间接接调用本身
def f1():
print('===>f1')
f2()
def f2():
print('===>f2')
f1()
f1()
# 一段代码的循环运行的方案有两种
# 方式一:while、for循环
while True:
print(1111)
print(2222)
print(3333)
# 方式二:递归的本质就是循环:
def f1():
print(1111)
print(2222)
print(3333)
f1()
f1()
# 二:需要强调的是:
# 递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用(return)
# 一般情况下Python默认的递归层数是1000,也没有尾递归优化
n=0
while n < 10:
print(n)
n+=1
def f1(n):
if n == 10:
return
print(n)
n+=1
f1(n)
f1(0)
# 三:递归的两个阶段(这里指的是思路)
# 回溯:一层一层调用下去(找到满足条件的时候),从上往下
# 递推:满足某种结束条件,结束递归调用,然后一层一层返回,从下往上
age(5) = age(4) + 10
age(4) = age(3) + 10
age(3) = age(2) + 10
age(2) = age(1) + 10
age(1) = 18
def age(n):
if n == 1:
return 18
return age(n-1) + 10
res=age(5)
print(res)
# 四:递归应用
l=[1,2,[3,[4,[5,[6,[7,[8,[9,10,11,[12,[13,]]]]]]]]]]
def f1(list1):
for x in list1:
if type(x) is list:
# 如果是列表,应该再循环、再判断,即重新运行本身的代码
f1(x)
else:
print(x)
f1(l)
查看设置递归的层数(了解但是不要使用)
import sys
sys.getrecursionlimit() # 查看递归深度限制
sys.setrecursionlimit(1200) # 修改递归深度限制
算法之二分法
在一个从小到大排列的数字列表中,寻找某个值的时候
思路:找到列表中间的值——》与你要找的值进行比较,判断在左还是在右——》重复前面的环节——》解决一下其他的问题(要找的值在列表中不存在、就是切片到最后的时候列表为空)
nums=[-3,4,7,10,13,21,43,77,89] # 数值从小到大排列
find_num=10 # 要找到10
nums=[-3,4,13,10,-2,7,89]
nums.sort()
print(nums)
# 方案一:整体遍历效率太低,当元素数量过多的时候会花费较长的时间
for num in nums:
if num == find_num:
print('find it')
break
# 方案二:二分法
def binary_search(find_num,列表):
mid_val=找列表中间的值
if find_num > mid_val:
# 接下来的查找应该是在列表的右半部分
列表=列表切片右半部分
binary_search(find_num,列表)
elif find_num < mid_val:
# 接下来的查找应该是在列表的左半部分
列表=列表切片左半部分
binary_search(find_num,列表)
else:
print('find it')
nums=[-3,4,7,10,13,21,43,77,89]
find_num=8
def binary_search(find_num,l):
print(l)
if len(l) == 0:
print('找的值不存在')
return
mid_index=len(l) // 2
if find_num > l[mid_index]:
# 接下来的查找应该是在列表的右半部分
l=l[mid_index+1:]
binary_search(find_num,l)
elif find_num < l[mid_index]:
# 接下来的查找应该是在列表的左半部分
l=l[:mid_index]
binary_search(find_num,l)
else:
print('find it')
binary_search(find_num,nums)

浙公网安备 33010602011771号