“实践”;裸报;在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))
}