Python 递归之二分法从列表中找指定的值

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)

笔记文件链接

在这里插入图片描述

>_<点我下载笔记~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值