函数返回返回语句时不会退出

时间:2018-12-07 01:24:26

标签: go

我有一个奇怪的问题。我在玩Go时发现一些非常奇怪的行为,我无法弄清楚。

当我运行findMatchingSum函数时,它将搜索期望的总和,如果sum较大,则将最后一个索引递减1,如果较大,则将第一个索引递增1。

但是,当我调试代码时,它将首先击中if语句并应返回true,但是相反,它将直接运行并在else if语句之后运行。

混乱从这里开始。在第3次迭代中,它命中了if语句进入该块,但没有退出该函数。

这是代码;

package main

import "fmt"

var arr  = []int{1,2,4,4}

func main() {
    s := findMatchingSum(arr, 8, len(arr) - 1, 0)
    fmt.Println(s)
}

func findMatchingSum(arr []int, sum , last, first int ) bool {
    if arr[first] + arr[last] == sum {
        return true
    } else if  arr[first] + arr[last] > sum {
        findMatchingSum(arr, sum, last - 1, first)
    } else if arr[first] + arr[last] < sum {
        findMatchingSum(arr, sum, last, first + 1)
    }
    return false
}

1 个答案:

答案 0 :(得分:3)

您忘了从else-if分支“返回”。这应该起作用:

func findMatchingSum(arr []int, sum , last, first int ) bool {
    if arr[first] + arr[last] == sum {
        return true
    } else if  arr[first] + arr[last] > sum {
        return findMatchingSum(arr, sum, last - 1, first)
    } else if arr[first] + arr[last] < sum {
        return findMatchingSum(arr, sum, last, first + 1)
    }
    return false
}

如果不这样做,将执行第三个分支,但该函数不会退出-它将跳转到下一条指令,即“返回false”。