二分查找介绍

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

python递归比对复杂json_二分查找

递归思想(化整为零)

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

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

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

python递归比对复杂json_递归_02

递归三要素

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

python递归比对复杂json_二分查找_03


当要查找的元素不在目标列表中时

输入数字:4561

python递归比对复杂json_终止条件_04