go - 在 Go 中用递归练习 "Naked Returns"。我的ELSE语句中的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
    }
}

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/

相关文章:

Go:读取压缩的 gob 并将其写入文件

json - 如何在不嵌入的情况下将 JSON 解码添加到外部库类型

JavaScript - 数组的所有可能组合

java - 我的预购遍历出了什么问题?

php - PHP 函数末尾的 'return' 是什么意思?

Go:从 defer 中返回

image-processing - 如何让 golang 读取 jpeg 并获得与 Python/C 相同的 unit8 值?

go - golang中关闭chan的问题如何解决

java 树节点递归泛型

entity-framework - Entity Framework : How to return a row from a table with composite keys?