2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Python 二分查找(涉及递归思想)

Python 二分查找(涉及递归思想)

时间:2020-06-30 11:46:40

相关推荐

Python 二分查找(涉及递归思想)

二分查找介绍

二分查找(搜索)是一种在有序列表中查找某一特定元素的搜索算法。

首先先查找到目标列表的中间元素,如果中间元素正好是要查找的元素,则返回查找元素的索引下标,搜索结束;如果要查找的元素大于或者小于中间元素,则在列表大于或小于中间元素的那一半中查找,并且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表要查找的元素不在目标列表中。

这种搜索算法每一次比较都使搜索范围缩小一半,是一方便快捷的搜索算法。

递归思想(化整为零)

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

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

在数学与计算机科学中,递归(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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。