在Go中使用递归练习“裸体退货”。 ELSE语句中的return语句不正确吗?

时间:2018-08-02 14:54:19

标签: go recursion return

尝试一个简单的递归函数,该函数需要一个数字,并以某种方式对其进行拆分,并且仅当拆分后的数字彼此相等时才应将其返回。

package main

import "fmt"

func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x

    if y == x || sum > 200 {
        return
    } else {
        split(sum+1)
        return
    }
}

func main() {
    fmt.Println(split(10))
}

fmt.Println(split(10))的输出为4 and 6,这是不正确的,因为它们彼此不相等。这是由于return语句还是ELSE语句的结尾吗?我有JAVA背景,所以我认为那条线永远不会被击中。

1 个答案:

答案 0 :(得分:0)

在使用(x, y int)声明函数声明时在函数定义中声明变量时,此时将返回xy的值。当您递归调用split函数时,它将为该函数调用分配新的xy,因此,更改那里的值不会影响外部范围。

您可以通过返回递归split的返回值来解决此问题,因为当前您正在通过在返回之前的行上调用结果来忽略结果。

但是,我要注意的是,在此实现中,任何大于0的输入值都不会相等,并且对于任何输入,其返回值都与sum > 200子句触发器相同。

https://play.golang.org/p/fzuPtqPCxpE

package main

import "fmt"

func split(sum int) (int, int) {
    x := sum * 4 / 9
    y := sum - x

    if y == x || sum > 200 {
        return
    } else {
        return split(sum + 1)
    }
}

func main() {
    fmt.Println(split(10))
}