尝试一个简单的递归函数,它接受一个数字,以某种方式拆分它,并且只有在拆分后的数字彼此相等时才应该返回它。
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 和 6
,这是不正确的,因为它们彼此不相等。这是由于我的 ELSE 语句末尾的 return 语句吗?我有 JAVA 背景,所以我认为那条线永远不会被击中。
最佳答案
当您使用 (x, y int)
在函数定义中声明变量时执行返回将返回 x
的值和 y
在那时候。当您递归调用 split 函数时,它将分配一个新的 x
。和 y
对于该函数调用,因此更改那里的值不会影响外部范围。
您可以通过返回递归 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))
}
关于go - 在 Go 中用递归练习 "Naked Returns"。我的ELSE语句中的return语句不正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51656606/