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