二分查找递归返回无

Posted

技术标签:

【中文标题】二分查找递归返回无【英文标题】:binary search recursive returns none 【发布时间】:2020-10-26 00:50:35 【问题描述】:

我试图在 python 中编写二进制搜索。我写的是:



arr = [6, 13, 14, 25, 33, 43, 51, 53, 64, 72, 84, 93, 95, 96, 97]

def binarySearch(arr, low, high, key):
    if(low <= high):
        mid = (low + high) // 2
        if(arr[mid] == key):
            return key

        elif(arr[mid] > key):
            binarySearch(arr, low, mid - 1, key)

        else:
            binarySearch(arr, mid + 1, high, key)

    else:
        return -1

i = binarySearch(arr, 0, len(arr) - 1, 33)
print(i)

它返回无。然后我发现我没有在递归调用的开头放置 return 语句。但在我看来,如果没有返回语句,它无论如何都应该返回密钥,因为它首先控制它是否与密钥匹配。为什么函数找到键后继续执行并返回None而不是键。

【问题讨论】:

你真正想做的是返回函数,例如做return binarySearch(arguments) 而不是简单的binarySearch() 【参考方案1】:

它不会返回,因为您没有要求它返回。但是,我猜如果您确实放入了 return 语句,它仍然会返回错误的东西 - 键,与键所在的索引(您知道键是什么,为什么要进行计算以返回吗?)

【讨论】:

是的,我应该返回键的索引。不修复它是我的坏事。我的意思是,它不应该在 --- if(arr[mid] == key): return key --- 这行被执行时终止函数吗?【参考方案2】:

这是您可能会考虑的二进制搜索的非递归变体。

def binary_search(arr, x):
    # Time O(log n)
    # Space O(1)
    left = 0; right = len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if x > arr[mid]:
            left = mid + 1
        elif x < arr[mid]:
            right = mid - 1
        else:
            return mid
    return False

【讨论】:

【参考方案3】:
arr = [6, 13, 14, 25, 33, 43, 51, 53, 64, 72, 84, 93, 95, 96, 97]


def binarySearch(arr, low, high, key):
    if(low <= high):
        mid = (low + high) // 2
        if(arr[mid] == key):
            return key

        elif(arr[mid] > key):
            return binarySearch(arr, low, mid - 1, key)

        else:
            return binarySearch(arr, mid + 1, high, key)

    else:
        return -1


i = binarySearch(arr, 0, len(arr) - 1, 33)
print(i)

【讨论】:

以上是关于二分查找递归返回无的主要内容,如果未能解决你的问题,请参考以下文章

递归1--二分查找

二分法查找

二分查找算法(JAVA)

二分查找算法(JAVA)

《图解算法》--二分查找选择排序递归

递归 —— 二分查找法 —— 归并排序