社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

为什么python中的递归二进制搜索函数不起作用

BLINAK • 3 年前 • 1231 次点击  

我需要编写一个简单的递归函数,从index:left到index:right搜索数组。我们不必担心无效的左输入和右输入,它们总是正确的。如果数组中有一个值等于键,它将返回该值的索引。如果密钥不在数组中,它将返回 -1. 我真的不知道为什么我的函数不起作用。我觉得应该。只有当键是数组的第一个索引时,它才有效。

def binary_search_recursive(array: List[int], left: int, right: int,
                            key: int) -> int:
    if left <= right:
        if array[left] == key:
            return left
        else:
            binary_search_recursive(array, left + 1, right, key)
    return -1

测试:

binary_search_recursive([0,1,5,6,23,45], 0, 5, 5)

应返回:

2

返回:

-1
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129258
 
1231 次点击  
文章 [ 3 ]  |  最新文章 3 年前
MaxPC08
Reply   •   1 楼
MaxPC08    3 年前

你需要在第二次返回时签上标签。尝试:

                            key: int) -> int:
    if left <= right:
        if array[left] == key:
            return left
        else:
            binary_search_recursive(array, left + 1, right, key)
            return -1 #Moved to the right.
BrokenBenchmark
Reply   •   2 楼
BrokenBenchmark    3 年前

您需要将递归调用的结果返回给 binary_search_recursive() :

binary_search_recursive(array, left + 1, right, key)

应该是

return binary_search_recursive(array, left + 1, right, key)

请注意,这是 二进制搜索算法;一次只枚举一个元素(使用递归),所以这实际上是一个顺序搜索。

Lrrr
Reply   •   3 楼
Lrrr    3 年前

要修复代码,需要返回else语句:

def binary_search_recursive(array: list[int], left: int, right: int,
                            key: int) -> int:
    if left <= right:
        if array[left] == key:
            return left
        else:
            return binary_search_recursive(array, left + 1, right, key)
    return -1

但它仍然不是二进制搜索。

编辑: 真正的二进制搜索应该是如下所示:

def binary_search_recursive(array: list[int], left: int, right: int,
                            key: int) -> int:
    if right >= left:

        center = (right + left) // 2

        if array[center] == key:
            return center

        elif array[center] > key:
            return binary_search_recursive(array, left, center - 1, key)
        else:
            return binary_search_recursive(array, center + 1, right, key)
    return -1