Python 递归中使用二分法从列表中找指定的值
实例题目
- 用递归实现2分查找的算法,以从列表 p = [2, 3, 5, 10, 15, 16, 18, 22, 26, 30, 32,
35, 41, 42, 43, 55, 56, 66, 67, 69, 72, 76, 82, 83, 88] 中查找指定的值。
思维导图
方法一:通过查询序列方法
p = [2, 3, 5, 10, 15, 16, 18, 22, 26, 30, 32, 35, 41, 42, 43, 55, 56, 66, 67, 69, 72, 76, 82, 83, 88]
def modify_sequence(nums, target: int, start=0, end=None, count=0):
"""
使用二分法进行查找列表中是否有指定的值(通过改查询序列查找的方法)
:param nums: 为列表变量
:param target: 为指定的查找值
:param start: 为列表开头序列,默认为0,即第一个
:param end: 为列表结尾序列
:param count: 递归次数保存
:return: None
"""
if count == 0: # 判断是否第一次循环,若是计算数组结尾序列并赋值给end
end = len(nums) - 1
count += 1
median = (start + end) // 2
value = nums[median]
if value > target:
modify_sequence(nums, target, start, median-1, count)
elif value < target:
modify_sequence(nums, target, median+1, end, count)
elif value == target:
print(f"\033[1;32m//查找:{target} 值成功\033[0m,二分查询次数:{count}")
else:
print("你要找的值不在列表里")
方法二:更改列表方法
p = [2, 3, 5, 10, 15, 16, 18, 22, 26, 30, 32, 35, 41, 42, 43, 55, 56, 66, 67, 69, 72, 76, 82, 83, 88]
def new_list(nums, value, count=0):
"""
使用二分法进行查找列表中是否有指定的值(通过更改列表的方法)
:param nums: 为列表变量
:param value: 为指定的查找值
:param count: 递归次数保存
:return: 返回结果,默认为None
"""
count += 1
median = len(nums) // 2
if nums[median] > value:
new_p = nums[:median-1]
new_list(new_p, value, count)
elif nums[median] < value:
new_p = nums[median+1:]
new_list(new_p, value, count)
elif nums[median] == value:
print(f"\033[1;32m//查找:{value} 值成功\033[0m,二分查询次数:{count}")
else:
print("你要找的值不在列表里")
两个方法各有优缺点,改查找区间或改列表,根据使用场景选择
调用
p = [
2, 3, 5, 10, 15, 16, 18, 22, 26, 30, 32, 35, 41,
42, 43, 55, 56, 66, 67, 69, 72, 76, 82, 83, 88
]
modify_sequence(p, 66)
new_list(p, 66)