二分查找介绍

  二分查找(搜索)是一种在有序列表中查找某一特定元素的搜索算法。
  首先先查找到目标列表的中间元素,如果中间元素正好是要查找的元素,则返回查找元素的索引下标,搜索结束;如果要查找的元素大于或者小于中间元素,则在列表大于或小于中间元素的那一半中查找,并且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表要查找的元素不在目标列表中。
  这种搜索算法每一次比较都使搜索范围缩小一半,是一方便快捷的搜索算法。

递归思想(化整为零)

  由于这种搜索的整个过程可以分割成许多个相同的操作流程,所以可以运用递归思想使代码变得轻盈优雅。

递归定义(什么是递归?)

  在数学与计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身。
  实际上,递归,顾名思义,其包含了两个意思:递和归,这正是递归思想的精华所在。
  简而言之就是定义一个函数,在其中定义一个条件,满足该条件将会返回该函数函数名,即函数调用函数本身。需要注意的是,定义的递归函数必须有明确的结束条件,否则就会导致无限递归的情况。

递归三要素

1). 明确递归终止条件

  递归就是有去有回,因此必然应该有一个明确的临界点,程序一旦到达了这个临界点,就不用继续往下递去而是开始实实在在的归来,防止无限递归。

2). 在递归终止时提供处理办法

  由于在递归函数中存在临界点,当满足临界点时,我们应该给出问题的解决方案。一般地,在这种情境下,问题的解决方案是直观的、容易的。

3). 提取重复的逻辑,缩小问题规模*

  由于递归问题一定可以分解为若干个规模较小、操作流程相同的子问题,这些子问题可以用相同的解题思路来解决。从程序实现的角度而言,我们需要抽象出一个干净轻盈的逻辑,以便使用相同的方式解决子问题。

实例:

二分法查找:输入一个有序的元素列表(必须有序),如果要查找的元素包含在其中,二分法查找返回其位置,否则返回None。

def findNum(lst, a, b, num):"""定义一个函数,使用二分法查找某元素在有序列表中的位置:param lst: 有序列表:param a: 列表的起始位置:param b: 列表的结束位置:param num: 要查找的元素:return: 返回要查找的元素在有序列表中的位置"""# 当要查找的元素在目标列表中时if num in lst:# 找出目标列表中间元素的下标middle = int((a + b) / 2)# 如果要查找的元素等于中间元素if lst[middle] == num:return '输入数字在列表中的索引是%d' % middle# 如果要查找的元素大于中间元素elif lst[middle] < num:return findNum(lst, middle, b, num)# 如果要查找的元素小于中间元素else:return findNum(lst, 0, middle, num)# 当要查找的元素不在目标列表中时else:return None# 随机定义一个有序列表
lst1 = [1, 5, 8, 12, 26, 45, 86, 112, 258, 598, 698]num1 = int(input('请列表中输入一个数字:'))# 调用函数并输出
print(findNum(lst1,0,len(lst1),num1))

运行结果:

当要查找的元素在目标列表中时
输入数字:26


当要查找的元素不在目标列表中时
输入数字:4561

Python 二分查找(涉及递归思想)相关推荐

  1. python 二分查找_Python实现二分法搜索

    二分法是一种效率比较高的搜索方法,时间复杂度为 O(log2n) .假设有一个1~100之间的数字,你来猜这个数是多少,每猜一次可以得到三种回答:正确.大了或小了.如何保证用最少的次数猜对?很多人会想 ...

  2. 二分查找算法递归和非递归实现

    自己接触和了解过的查找算法总结起来分为3个吧: 1. 静态查找(主要是二分查找,效率较高) 2. 动态查找(二叉查找树) 3. 哈希表 首先来说二分查找吧! 基本思想:假设在一个已经排好序的有序序列( ...

  3. python二分查找

    python二分查找的相关代码 二分查找 二分查找 二分查找是非常基本的算法题,一定要能熟练写出 def myBinarySearch(arr,target):##边界检查if len(arr) &l ...

  4. Java实现折半查找(二分查找)的递归和非递归算法

    Java二分查找实现,欢迎大家提出交流意见. /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其 ...

  5. JAVA常用算法一:二分查找【递归 or 非递归】

    文章目录 一.Java实现二分查找[递归] 二.Java实现二分查找[非递归] 三.测试 一.Java实现二分查找[递归] //递归使用二分查找public static int binarySear ...

  6. 猿创征文|python二分查找解密 青少年编程电子学会python编程等级考试三级真题解析2021年03月

    目录 python二分查找解密 一.题目要求 1.编程实现 2.输入输出 3.评分标准</

  7. 查找算法之一:二分查找(递归实现)

    二分查找的递归实现 思路分析 代码实现 思路分析 1.确定该序列的中间的下标mid: mid = (left + right)/2: 2.让需要查找的数findVal 与 arr[mid]进行比较: ...

  8. Python 二分查找与方程求解(公开代码)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Python 二分查找与方程求解 二分查找 a为左边界 b为右边界 value为真实值 注意:二分查找只适用于顺序列表的数值查找,乱序 ...

  9. python学习-综合练习七(二分查找(递归)、线性查找、插入排序、快速排序、选择排序、冒泡排序、归并排序、堆排序)-实例

    文章目录 二分查找 线性查找 插入排序 快速排序 选择排序 冒泡排序 归并排序 堆排序 推荐代码一 推荐代码二 希尔排序 拓扑排序 说明:本篇博文的知识点大部分来自 Python3 实例 二分查找 二 ...

最新文章

  1. 今年不容易,要懂得爱护自己
  2. MemCache详细介绍
  3. 图解 SpringCloud 体系!
  4. 【狂神说Redis】5 事务
  5. SQLServer2012 查询分析器的快捷键
  6. 云服务器怎么安装声音驱动_GPU云服务器如何安装NVIDIA Tesla驱动
  7. 下载软件时的X86和X64的区别
  8. DS二叉树—二叉树构建与遍历(不含框架)
  9. 常用的3种高效睡眠法,因人而异
  10. 如何离线安装所有依赖包
  11. 第九章 使用结构体类型处理组合数据——用户自定义数据类型
  12. 被假阀门坑过吗?如何辨别翻新阀门?
  13. TokyoCabinet:tch数据库的文件管理工具tchmgr
  14. 关于在KEIL下使用j-link读不到芯片的问题
  15. 最新传奇木马及其防范全攻略
  16. (22)打鸡儿教你Vue.js
  17. 是谁!让程序员只在乎自己的一亩三分地
  18. 三种睡后收入,你也完全可以拥有
  19. 骨传导运动耳机哪个牌子好,四大品牌骨传导运动耳机推荐
  20. A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。因为某种原因,他们是否参赛受到下列条件的约束

热门文章

  1. leetcode先刷_Unique Paths II
  2. 关于C#.NET中PerformanceCounter无法从系统备份存储中重建性能计数器设置,错误代码为 5的问题解决
  3. grep命令详解(常用参数)
  4. 电脑技巧:Win10安全模式知识介绍,看完你就懂了!
  5. app服务器端性能测试,APP性能测试工具使用说明
  6. 台式计算机联网用图教,Win10系统台式机如何使用无线网卡上网【图文教程】
  7. CentOS7下的PXE无人值守系统安装
  8. 日文版BEYOND海阔天空歌词假名注释后版本
  9. android漏洞检测工具,Android漏洞检测——模糊测试
  10. python 十进制转十六进制 蓝桥