day4 递归二分法查找
现有一个序列,data=[for i in range(1,5000,3)],现在要求看一个数是否在列表中存在,我们知道,我们可以使用in或__contains__()的方法,判断一个值是否在列表中,但是列表也是一个一个遍历,看是否与列表中的某个值相等,如果不等则返回False;如果在,则返回True。
def binary_search(data,find_n):
mid_n = int(len(data)/2)
#递归必须有结束条件,这里的结束条件是,当只有两个长度的时候必须结束
if mid_n > 1: #递归的结束条件,如果只有两个元素的时候就没有必要进行再一次判断了
if data[mid_n] > find_n: #如果中间值大于查找值,说明在列表的左侧
print(data[:mid_n])
binary_search(data[:mid_n],find_n) #再次进行递归,缩小范围
elif data[mid_n] < find_n: #如果中间值小于查找值,说明在中间值的右侧
print(data[mid_n:])
binary_search(data[mid_n:],find_n) #递归,缩小范围
elif data[mid_n] == find_n: #如果中间值等于查找值,说明在列表中
print("%s在列表data中" %find_n)
elif mid_n == 1:
#我们知道,递归结束的时候,有两种情况,第一种是长度等于2,另外一种情况是长度等于3
print(data)
if len(data) == 2: #如果列表长度等于2,那么就判断是否有一个等于查找值,
if data[0] == find_n or data[1] == find_n:
print("%s在列表data中" % find_n)
else:
print("%s不在列表data中" % find_n)
else:
#列表长度等于3的时候的情况,逐个进行比较
if data[0] == find_n or data[1] == find_n or data[2] == find_n:
print("%s在列表data中" %find_n)
else:
print("%s不在列表data中" %find_n) if __name__ == "__main__":
data = [i for i in range(1,5008,4)]
binary_search(data,10)

上面流程图中,详细描述了代码运转的过程,我们知道,如果使用递归,那么遍历列表的时候只有两种情况,要么查找的值在列表中,要么不在列表中,并且,到最后,列表的长度只可能为1和2,这个时候我们要分情况去考虑,上面总共有三种情况出现,(1)遍历过程中中间值正好就是我们要查找的值;(2)列表长度为1,那最后剩下的元素进行比较,这个时候一半就是小于等于最小值或者大于等于最大值;(3)列表的长度为2,这个时候情况也一样,要么大于等于最大值,小于等于最小值;出现列表1和2长度的原因是data原数据的长度有关,因为原数据有长度有单数和偶数之分,因此结果也会出现这两种情况,上述三种情况都要具体分析,不然肯定会报错。有些人可能输入的本来就是列表中的值肯定可以找的到,但如果不是的时候会报错。又或者奇数的时候对,偶数的时候错;偶数的时候对,奇数的时候错。
day4 递归二分法查找的更多相关文章
- python --- 14 递归 二分法查找
一.递归 1.函数自己调用自己 2.官方说明最大深度1000,但跑不到1000,要看解释器, 实测998 3.使⽤递归来遍历各种树形结构 二. 二分法查找 掐头结尾取中间 , 必须是有序序列 ...
- Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)
一.概念 二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法. 二.算法思想 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者 ...
- python 内置函数(二) 进阶函数 递归内容及二分法查找 知识点
1,lambda: 匿名函数 2.sorgted() 排序函数 3,filter() 过滤函数 筛选 4,map() 映射函数 5.递归 6.二分法 一. 匿名函数: lambda lamb ...
- Python【day 14-4】sorted filter map+递归文件夹+二分法查找
def func(x): #普通函数 return x*x ret1 = func(10) #匿名函数 f = lambda x:x*x # 匿名函数写法: 匿名函数名=lambda 参数:返回值 ' ...
- python3 二分法查找
'''二分法查找有序列表掐头去尾取中间查找列表中xx在不在列表中,在,则返回索引值'''# lst = [1, 4, 6, 8, 9, 21, 23, 26, 35, 48, 49, 54, 67, ...
- day17递归函数(二分法查找)
递归函数: 如果函数包含了对其自身的调用,该函数就是递归的: example 1:二分法查找的实现: def find_recursion(l,aim,start=0,end=None): #end不 ...
- python - 递归 二分法
一.一些内置函数 1.revsered 翻转,返回的是迭代器 # 将 s 倒置 s = '不是上海自来水来自海上' # 方法一 print(s[::-1]) # 方法二 s1 = reversed( ...
- python之路--递归, 二分法
一 . 递归 自己调用自己, 递归的入口(参数) 和 出口(return), 树形结构的遍历. def func(): print("我是递归") func() func() ...
- Day14--Python--函数二,lambda,sorted,filter,map,递归,二分法
今日主要内容:1. lambda 匿名函数 lambda 参数: 返回值-------------------------------------def square(x): return x**2 ...
随机推荐
- C++中添加配置文件读写方法
比如有一个工程,一些变量有可能需要不时的修改,这时候可以通过从配置文件中读取该数值,需要修改时只需要修改配位文件即可. 比如有一个这样的变量m_nTest; 我么可以写两个函数ReadConfig() ...
- MSA(微服务简介)
1.为什么要使用微服务? 要说为什么要使用微服务,我们要先说下传统的企业架构模式-垂直架构/单块架构模式,简单点说:我们一般将系统分为三层架构,但是这是逻辑上的三层,而非物理上的三层,这就意味着经过编 ...
- [应用篇]第四篇 JSTL之C标签介绍
JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...
- JavaScript定义类的几种方式
提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for ...
- 线程池-Threadlocal
ThreadLoclc初衷是线程并发时,解决变量共享问题,但是由于过度设计,比如弱引用的和哈希碰撞,导致理解难度大.使用成本高,反而成为故障高发点,容易出现内存泄露,脏数据.贡献对象更新等问题.单从T ...
- python学习笔记(十三)之lambda表达式
lambda表达式: 用法 lambda x : 2 * x + 1 其中:前面是参数,后面是返回值. >>> def ds(x): ... return 2 * x + 1 ... ...
- [HNOI2009]有趣的数列 题解(卡特兰数)
[HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满 ...
- Django之Form组件验证
今天来谈谈Django的Form组件操作 Django中的Form一般有两种功能: ·输入html ·验证用户输入 Form验证流程 ·定义规则(是一个类) ·前端把数据提交过来 ·匹配规则 · ...
- 43、os和sys模块的作用?
os与sys模块的官方解释如下: os:这个模块提供了一种方便的使用操作系统函数的方法. sys:这个模块可供访问由解释器使用或维护的变量和与解释器进行交互的函数. 总结:os模块负责程序与操作系统的 ...
- python作业Select版本FTP(第十周)
SELECT版FTP: 使用SELECT或SELECTORS模块实现并发简单版FTP 允许多用户并发上传下载文件 思路解析: 1. 使用IO多路复用的知识使用SELECTORS封装好的SELECTOR ...