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

时间:2017-11-03 11:23:36

标签: recursion go combinations

可以使用以下递归代码(灵感来自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)
}

1 个答案:

答案 0 :(得分:2)

我觉得每个rc来电都会重复使用s,因此您只需要确保将[][]int存储到scopy := append([]int{}, s...) 中以存储其副本,至于在下一次迭代中不覆盖其内容。

要复制切片,您可以使用如下附加:

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
}

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

contenteditable