如何在 GO 中的切片中存储递归获得的组合



可以使用以下递归代码打印组合(灵感来自Rosetta)

我认为将中间结果存储在 []int 中

或将组合集存储在 [][]int 中很容易。但是,由于该函数是递归的,因此它并不比替换

fmt.Println(s)

由一个

return s

例如,对函数输出稍作修改。我还尝试喂一个指针,例如

p *[][]int

递归函数中的变量"s",但我失败了:-/

我认为这是递归函数的普遍问题,所以如果你有一些解决这个问题的建议,它将对我有很大帮助!

提前非常感谢! ;)

package main
import (
    "fmt"
)
func main() {
    comb(5, 3)
}
func comb(n, m int) {
    s := make([]int, m)
    last := m - 1
    var rc func(int, int)
    rc = func(i, next int) {
        for j := next; j < n; j++ {
            s[i] = j
            if i == last {
                fmt.Println(s)  
            } else {
                rc(i+1, j+1)
            }
        }
        return 
    }
    rc(0, 0)
}
在我看来

,每个rc调用都在重用s,因此您只需要确保在将s存储到[][]int时存储其副本,以免在下一次迭代中覆盖其内容。

要复制切片,您可以像这样使用 append:

scopy := append([]int{}, s...)

https://play.golang.org/p/lggy5JFL0Z

package main
import (
    "fmt"
)
func main() {
    out := comb(5, 3)
    fmt.Println(out)
}
func comb(n, m int) (out [][]int) {
    s := make([]int, m)
    last := m - 1
    var rc func(int, int)
    rc = func(i, next int) {
        for j := next; j < n; j++ {
            s[i] = j
            if i == last {
                out = append(out, append([]int{}, s...))
            } else {
                rc(i+1, j+1)
            }
        }
        return
    }
    rc(0, 0)
    return out
}

最新更新