Go 中的二分搜索 - 到底为什么这是不正确的

lil*_*ily 4 binary-search go

无法弄清楚为什么二分搜索在 go 中的实现不正确。输入是([]int{-1, 0, 3, 5, 9, 12}, 9)

func Search(nums []int, target int) int {

    mid := len(nums) / 2

    if nums[mid] == target {
        return mid
    }
    if len(nums) >= 1 {
        if nums[mid] < target {
            return Search(nums[mid+1:], target)
        } else {
            return Search(nums[:mid], target)
        }
    }

    return -1
}
Run Code Online (Sandbox Code Playgroud)

Sar*_*ATM 6

二分查找

更新以修复无限递归

感谢@sprutex 发现该错误

func Search(nums []int, target int) int {
    mid := len(nums) / 2

    if nums[mid] == target {
        return mid
    }
    if len(nums) > 1 {
        if nums[mid] < target {
            res := Search(nums[mid:], target)
            if res == -1 {
                return -1
            }
            return res + mid
        } else {
            return Search(nums[:mid], target)
        }
    }

    return -1
}
Run Code Online (Sandbox Code Playgroud)

原答案

请勿使用 - 搜索不在列表中的项目时包含无限递归错误。

func Search(nums []int, target int) int {

    mid := len(nums) / 2

    if nums[mid] == target {
        return mid
    }
    if len(nums) >= 1 {
        if nums[mid] < target {
            return Search(nums[mid:], target) + mid
        } else {
            return Search(nums[:mid], target)
        }
    }

    return -1
}
Run Code Online (Sandbox Code Playgroud)

更改的一行如下:

return Search(nums[mid:], target) + mid

  • 因为递归调用是基于子切片的。搜索这个较小的子切片需要重新添加原始偏移量(“mid”)以使其引用正确的索引。 (2认同)