在 Go 中使用递归练习"Naked Returns"。我的 ELSE 语句中的返回语句不正确吗?



尝试一个简单的递归函数,该函数接受一个数字,以某种方式对其进行拆分,并且只有在拆分后的数字相等时才返回。

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,这是不正确的,因为它们彼此不相等。这是由于ELSE语句末尾的return语句造成的吗?我有JAVA背景,所以我想这句话永远不会被击中。

当您在函数定义中声明变量时,(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))
}

最新更新