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