首页 > 编程语言 >Python 递归函数实现二分法,带思路解释

Python 递归函数实现二分法,带思路解释

时间:2024-03-18 20:04:49浏览次数:19  
标签:return 数列 递归函数 Python number len 二分法 int numbers

        二分法可以大大提升对有序数列的查找,传统的迭代查找会挨个比较数列中的值,如果数列较为庞大会影响查询效率。二分法每次取数列的中间数与待查找数字比较大小,以升序排列为例子 首先要考虑数列长度的奇偶性。

        奇数取中间位置的数字,如果比待查找数字大就应该往左找。此时要收缩数列的长度,把从中间数后面的数列全部‘砍掉’:newlist=oldlist[0:中间数字下标];  同理如果比待查数小就要砍掉中间数之前的数字:newlist=oldlist[中间数下标 : len(oldlist)].    备注.python中截取数列的方式是 list[起点: 终点],终点下标截取是终点-1,如果要截取到终点需要额外+1。

        在反复二分查找的时候会生成新的数列,如果要使用递归方式实现二分就应该要传入被分割后现序列的起点和终点分别对应 ‘初始序列’的位置。如[1,2,3,4,5,6]被分成[3,4,5]后新序列的0坐标对应的是原来的坐标2——list[2]。以向右截取为例,递归时新数列下标对应的原序列长度算法应该是现数组长度的一半+传入的上次坐标(如果第一次二分上次坐标就是0)。到此时就大概了解递归这个函数每次需要传入的参数大概要四个分别为(待查找数,原起点,原终点,被遍历数列)。

        如果是偶数个的中间参数有两个,我的想法是小于比左边大于比右边,如果夹中间待查找数字不存在的情况。待查找数<中间数1 ;中间数2<待查找书;数1<待查找数<数2,返回-1查找失败。

        附上代码仅表示个人做题思路,不是标准答案。

def findnumber(number, preindex, finindex, *numbers):       # 二分法找数
    index = preindex  # 传入的上次坐标
    findex = finindex  # 终点坐标+1
    if len(numbers) % 2 == 0:       # 判断奇偶


        if numbers[int(len(numbers)/2)] == number:  
            return int(len(numbers)/2) + index
        elif numbers[int(len(numbers)/2-1)] == number:      # 判断中间两个数是否符合
            return int(len(numbers)/2-1) + index
        elif numbers[int(len(numbers)/2)] < number:         # 比待查数小往右分割
            if len(numbers)==2:     # 如果只剩两个数还是比最大的大就是找不到
                return -1
            else:   
                newnumbers = list(numbers)[int(len(numbers)/2): len(numbers)]
                return findnumber(number, index+int(len(numbers)/2),findex, *newnumbers)
        elif numbers[int(len(numbers)/2-1)] > number:
            if len(numbers)==2:         # 剩两个数还是比最小的小,找不到。
                return -1
            else:
                newnumber2 = list(numbers)[0:int(len(numbers)/2-1)]
                return findnumber(number, index, findex-int((len(numbers)-1)/2), *newnumber2)
        elif (numbers[int(len(numbers)/2-1)]<number<numbers[int(len(numbers)/2)]) and len(numbers)==2 :
                # 待查数卡中间,找不到的情况
            return -1

    else:       # 奇数

        if numbers[int((len(numbers)-1)/2)] == number:
            return int((len(numbers)-1)/2)+index
        elif numbers[int((len(numbers)-1)/2)] > number:
            if len(numbers) == 1:
                return -1
            else:
                newnumber = list(numbers)[0:int((len(numbers)-1)/2)]
                return findnumber(number, index, findex-int((len(numbers)-1)/2), *newnumber)
        elif numbers[int((len(numbers)-1)/2)] < number:
            if len(numbers) == 1:
                return -1
            else:
                newnumber2 = list(numbers)[int((len(numbers)-1)/2):len(numbers)]
                return findnumber(number, int((len(numbers) - 1) / 2) + index, findex, *newnumber2)

 

list1 = [1, 2, 3, 4, 5, 6, 7]
list2 = []
for i in range(0,50):
    list2.append(i)

print(findnumber(2.5, 0, len(list1), *list1))
print(findnumber(2, 0, len(list2), *list2))

 

 

 

标签:return,数列,递归函数,Python,number,len,二分法,int,numbers
From: https://blog.csdn.net/qq1340058751/article/details/136752609

相关文章

  • six,一个神奇的 Python 版本兼容工具库!
    目录前言什么是Pythonsix库?核心功能使用方法 1.安装six库 2.导入six库 3.使用兼容性函数实际应用场景 1.代码库维护 2.项目迁移和重构 3.兼容性包装器总结前言大家好,今天为大家分享一个神奇的Python库-six。Github地址:https://github......
  • toapi,一个强大的 Python Web API库!
    目录前言什么是PythonToapi库?核心功能使用方法 1.安装Toapi库 2.创建Toapi应用 3.定义规则和过滤器 4.运行Toapi应用实际应用场景 1.数据提取与分析 2.自动化爬虫和数据抓取 3.构建自定义搜索引擎高级功能和进阶用法 1.动态页面渲染......
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的血细胞检测与计数系统(Python+PySide6界面+训练代码
    摘要:本文介绍了一种基于深度学习的血细胞检测系统系统的代码,采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果,能够准确识别图像、视频、实时视频流以及批量文件中的血细胞。文章详细解释了YOLOv8算法的原理,并提供了相应的Python实现代码、训练数据集,以及基于PySid......
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的疲劳驾驶检测系统(Python+PySide6界面+训练代码)
    摘要:本研究详述了一种采用深度学习技术的疲劳驾驶检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别疲劳驾驶行为。文章深入阐述了YOLOv8算法的......
  • Python中运算符and ,or 如何运算
    print(TrueandTrue)#True,前者为真,输出后者print(Trueand3)#3,前者为真,输出后者print(0andTrue)#0,前者为假,输出前者print(3or4)#3,前者为真,输出前者print(0or3)#3,前者为假,输出后者print(TrueorFalse)#True,前者为真,输出前者print(Trueor3)#True,前......
  • Python教程:生成Excel并更改表头
    简介在数据处理和报告生成中,Excel文件是一种常见的格式。Python提供了许多库来处理Excel文件,其中包括openpyxl,它是一个功能强大且易于使用的库,可以用来生成、修改和读取Excel文件。本文将介绍如何使用Python的openpyxl库生成Excel文件,并且演示如何更改表头。生成Excel文件首先......
  • 如何使用Python去除文件后缀名?
    简介在Python中,我们常常需要操作文件,包括文件的读取、写入、重命名等操作。在文件操作中,我们经常会遇到需要去除文件后缀的问题。那么,Python如何去除文件后缀呢?本文我们将介绍如何使用Python来去除文件后缀。去除文件后缀名的方法在Python中,去除文件后缀名有多种方法,我们将介绍......
  • Python实现:教你轻松统计文件夹下文件个数
    简介在日常的文件管理中,我们经常需要统计某个文件夹下文件的数量,这对于数据管理、文件清理等工作至关重要。Python作为一种强大而灵活的编程语言,提供了多种方法来实现这一目标。本文将介绍几种Python实现统计文件夹下文件个数的方法,并逐步解析它们的原理和用法。使用os模块Pyth......
  • Python教程:如何获取颜色的RGB值
    简介在许多计算机图形和图像处理应用中,颜色的RGB值是至关重要的信息。Python作为一种多功能的编程语言,提供了丰富的工具和库,可以轻松地获取颜色的RGB值。本文将介绍如何使用Python获取颜色的RGB值,以及一些实际应用的示例。使用PIL工具获取颜色的RGB值PIL(PythonImagingLibrar......
  • Python编程规范+最佳实践
    前言Python之禅是影响Python编程语言设计的19条原则,也是Python编码规范的核心理念。优美胜于丑陋(Python以编写优美的代码为目标)明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)复杂胜于凌乱(如果复杂不可避免,......