【问题标题】: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()

标签: python algorithm recursion return


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 2021-04-08
      相关资源
      最近更新 更多