“实践”;裸报;在Go中使用递归。我的ELSE语句中的return语句是否不正确?

“实践”;裸报;在Go中使用递归。我的ELSE语句中的return语句是否不正确?,go,recursion,return,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

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

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(分割(10))
的输出是
4和6
,这是不正确的,因为它们彼此不相等。这是由于我的ELSE语句结尾的return语句造成的吗?我有JAVA背景,所以我认为该行永远不会被命中。

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

您可以通过返回递归
split
调用的返回值来修复此问题,因为当前您在返回之前的行上调用它会忽略结果

但是我要注意的是,在这个实现中,任何输入值>0都将永远不相等,并且将为任何输入返回与
sum>200
子句触发器相同的值


好吧,我只是在没有
sum>200上限的情况下尝试了一下,结果发现了一个StackOverflow错误。这可能是原因吗?它得到一个错误,因此它只返回ELSE语句的下一部分,并返回不会导致错误的内容?对
sum()
@Adrian递归调用返回的值,您没有做任何操作@Adrian您能确切地阐明您的意思吗?@Adrian说
x,y=split(sum+1)
split(sum+1)
是不同的东西,前者对
的返回值进行拆分,而后者忽略它们。如果
int,int
x,y int
,而
:=
=
,与原始问题相同,效果更好?
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))
}