如何正确递归调用替代类型的二进制搜索(python)?

How to properly recursively call alternative type of binary search (python)?

我明白了二进制搜索的要点,但我无法理解为什么这个 不完整 (因为我没有指定我希望搜索到 运行 on) 代码甚至不会 return 任何值(例如对于小长度的列表)。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        def bin_search(start, end, nums, target):
            mid = int((start+end)/2)
            if start >= end:
                return -1     
            if nums[mid] == target:
                return mid
            elif nums[start] == target:
                return start
            elif nums[end] == target:
                return end
            bin_search(mid, end-1, nums, target)
            bin_search(start+1, mid, nums, target)


        output = bin_search(0, len(nums)-1, nums, target)
        return output

取自以下leetcode:https://leetcode.com/problems/search-in-rotated-sorted-array/

我知道这应该是什么样子——在那些情况下,人们只会检查 sub_list 的 MID 是否等于我们的目标。我也不明白为什么我不应该检查开始和结束。

此外,上面的代码,即使它找到了目标的索引,当递归结束时它也不会正确return。

非常感谢任何建议。我想重复一遍,我意识到我没有指定二进制搜索应该 运行 的哪一边,但是,我只是想了解为什么它甚至 return 没有任何价值。

谢谢。

您 return 仅针对基本情况的值。在 "normal" 个案例中

        bin_search(mid, end-1, nums, target)
        bin_search(start+1, mid, nums, target)

你return什么都没有。因此,当您按照自己的方式将堆栈返回到原始调用时,没有 return 值。尝试

        r_search = bin_search(mid, end-1, nums, target)
        l_search = bin_search(start+1, mid, nums, target)
        return max(r_search, l_search)

它不会 return 任何值,因为除非您找到该元素,否则您不会 return 任何东西,因此如果在第一次调用时它没有找到该元素,则什么也不会return编辑。要继续以递归方式查找值,您应该在递归调用函数之前添加 return,例如:

def bin_search(start, end, nums, target):
    mid = int((start+end)/2)
    if start >= end:
        return -1     
    if nums[mid] == target:
        return mid
    elif nums[start] == target:
        return start
    elif nums[end] == target:
        return end
    s1 = bin_search(mid, end-1, nums, target)
    if s1 >= 0:
        return s1
    return bin_search(start+1, mid, nums, target)

但是,您应该着手实施二分查找。例如,当你没有找到元素时,你应该选择去哪里,并将两次调用减少到一次调用。我还建议尝试二进制搜索的迭代方法,例如:

def bin_search(start, end, nums, target):
    # suppose we're just looking for the number in a sorted array
    while start <= end:
        mid = (start + end) // 2
        if nums[mid] == target:
            return mid
        if nums[mid] > target:
            end = mid-1
        else:
            start = mid+1
    return -1