尝试一个简单的递归函数,该函数接受一个数字,以某种方式对其进行拆分,并且只有在拆分后的数字相等时才返回。
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)
执行返回将返回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))
}