一、算法
什么是算法?算法是高效解决问题的办法。
算法之二分法针对递归的实例
需求:有一个按照从小到大顺序排列的数字列表,查找某一个数字
# 定义一个无序的列表
nums = [3,4,5,67,8,9,124,1541,56,23637,7,37,321,21,61,515,1] nums.sort() # 给列表排序
print(nums) # 运行结果:[1, 3, 4, 5, 7, 8, 9, 21, 37, 56, 61, 67, 124, 321, 515, 1541, 23637]
# nums = [-2,3,4,6,13,23,56,74,251,562,7437] # find_num = 13 # 方案一:整体遍历效率太低 # for num in nums: # if num == find_num: # print("find it") # break # for循环的弊端:效率低,得看运气。
# 使用二分法:从中间开始找,伪代码 # def binary_search(find_num,列表): # mid_val=找列表中间的值 # if find_num > mid_val: # # 应该在列表的右半部分查找 # # (1)新列表 = 列表切片右半部分 # # (2)重复本身的代码(列表) # elif find_num < mid_val: # # 应该在列表的左半部分 # # (3)新列表 = 列表切片左半部分 # # (4)重复本身的代码(列表) # else: # find_num= mid_val # # 找到了 # print('find it')
# 使用二分法具体实现需求 # nums = [-2,3,4,6,13,23,56,74,251,562,7437] # find_num = 13 # def binary_search(find_num,l): # mid_index = len(l) // 2 # 获取列表中间值的索引 # # mid_val=找列表中间的值 # mid_val = l[mid_index] # if find_num > mid_val: # # 应该在列表的右半部分查找 # # (1)新列表 = 列表切片右半部分 # l = l[mid_index + 1:] # 列表切片,从中间索引加1处到列表最后。 # # (2)重复本身的代码(列表) # binary_search(find_num,l) # elif find_num < mid_val: # # 应该在列表的左半部分 # # (3)新列表 = 列表切片左半部分 # l = l[:mid_index] # 列表切片,从列表头到中间索引处。 # # (4)重复本身的代码(列表) # binary_search(find_num,l) # else: # find_num= mid_val # # 找到了 # print('find it') # binary_search(find_num,nums)
# 使用交互式程序获取一个列表的索引值 # >>> nums = [1,2,3,4,5] # 定义一个含有奇数个的列表 # >>> len(nums) // 2 # 获取这个列表的中间索引值 # 2 # 这个列表的中间索引值是2 # >>> nums = [1,2,3,4,5,6] #定义一个含有偶数个的列表 # >>> len(nums) // 2 # 获取这个列表的中间索引值 # 3 # 这个列表的中间索引值是3
# 优化:二分法+递归解决需求
nums = [-2,3,4,6,13,23,56,74,251,562,7437] find_num = 15
def binary_search(find_num,l): # 查看调用列表的次数
print(l) # 针对列表索引值超出范围:IndexError: list index out of range
if len(l) == 0: print("找的值不存在!!") return mid_index = len(l) // 2 # 获取列表中间值的索引
if find_num > l[mid_index]: l = l[mid_index + 1:] # 列表切片,从中间索引加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)
# 第二次优化递归实现二分法:加入返回值
nums = [-3,4,7,10,13,21,43,77,89] # find_num = 3
def binary_search(find_num,l): print(l) if len(l) == 0: print("该值不存在!!!") return False mid_index = len(l) // 2
if find_num > l[mid_index]: l = l[mid_index:1] return binary_search(find_num,l) elif find_num < l[mid_index]: l = l[:mid_index] return binary_search(find_num,l) else: print('find it') return True res = binary_search(7,nums) print(res) """运行结果;没有return返回None [-3, 4, 7, 10, 13, 21, 43, 77, 89] [-3, 4, 7, 10] find it None """
# 获取结果的返回值:运行返回值是None?为啥?这要追溯到函数运行时的运行结果,没有return返回None
"""加入return后运行结果: [-3, 4, 7, 10, 13, 21, 43, 77, 89] [-3, 4, 7, 10] find it True """