尝试一个简单的递归函数,该函数需要一个数字,并以某种方式对其进行拆分,并且仅当拆分后的数字彼此相等时才应将其返回。
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背景,所以我认为那条线永远不会被击中。
答案 0 :(得分:0)
在使用(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))
}