This question already has answers here:
Generate all possible n-character passwords

(2个答案)


3个月前关闭。




我有一个整数列表a = [0, ..., n]。我想从a生成k个元素的所有可能组合;即a的笛卡尔积本身就是k次。请注意,n和k都可以在运行时更改,因此这至少需要一个可调整的函数。

因此,如果n为3,k为2:
a = [0, 1, 2, 3]
k = 2

desired = [(0,0), (0, 1), (0, 2), ..., (2,3), (3,0), ..., (3,3)]

在python中,我将使用itertools.product()函数:
for p in itertools.product(a, repeat=2):
    print p

在Go 中,此的惯用方式是什么?

最初的猜测是一个闭包,它返回整数 slice ,但是感觉不太干净。

最佳答案

例如,

package main

import "fmt"

func nextProduct(a []int, r int) func() []int {
    p := make([]int, r)
    x := make([]int, len(p))
    return func() []int {
        p := p[:len(x)]
        for i, xi := range x {
            p[i] = a[xi]
        }
        for i := len(x) - 1; i >= 0; i-- {
            x[i]++
            if x[i] < len(a) {
                break
            }
            x[i] = 0
            if i <= 0 {
                x = x[0:0]
                break
            }
        }
        return p
    }
}

func main() {
    a := []int{0, 1, 2, 3}
    k := 2
    np := nextProduct(a, k)
    for {
        product := np()
        if len(product) == 0 {
            break
        }
        fmt.Println(product)
    }
}

输出:
[0 0]
[0 1]
[0 2]
[0 3]
[1 0]
[1 1]
[1 2]
[1 3]
[2 0]
[2 1]
[2 2]
[2 3]
[3 0]
[3 1]
[3 2]
[3 3]

关于iterator - 如何创建笛卡尔积,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23412146/

10-13 03:57