去切片和循环:多个循环切片项目,同时减少每个循环上每个项目1的项目

时间:2016-10-12 20:37:16

标签: go

我有一些我希望循环多次的整数,但每次我做另一个循环时,我想从父循环中排除该项。

这样的事情:

func main() {
    as := []int{0, 1, 2, 3}
    for i, a := range as {
        bs := make([]int, len(as))
        copy(bs, as)
        bs = append(bs[:i], bs[i+1:]...)
        for i, b := range bs {
            cs := make([]int, len(bs))
            copy(cs, bs)
            cs = append(cs[:i], cs[i+1:]...)
            for i, c := range cs {
                ds := make([]int, len(cs))
                copy(ds, cs)
                ds = append(ds[:i], ds[i+1:]...)
                for _, d := range ds {
                    fmt.Println(a, b, c, d)
                }
            }
        }
    }
}

此代码的输出为:

0123
0132
0213
0231
0312
0321
1023
1032
1203
1230
1302
1320
2013
2031
2103
2130
2301
2310
3012
3021
3102
3120
3201
3210

这就是我想要的。但是这段代码看起来并不那么好。在删除项目之前,我必须多次复制切片,然后遍历该切片上的项目。我有更好,更干燥的方式来实现我在这里所做的事情吗?对于看起来像这样的切片,我会做同样的事情:[]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

我不认为像我做过10次一样编写每个循环是一种很好的做事方式。有什么建议我怎么做?

1 个答案:

答案 0 :(得分:5)

您似乎并不知道您正在做的事情被称为生成排列。否则,谷歌将很容易成为一种有效的算法。