生成排列-交换功能

时间:2019-12-02 15:28:43

标签: algorithm combinatorics

我将阅读EPI书,并在Go中调整解决方案。我不了解“生成排列”的解决方案。下面是我在Go中的实现(可以正常运行):

    func permutations(A []int) [][]int {
    result := [][]int{}
    var directedPermutations func(i int)
    directedPermutations = func(i int) {
        if i == len(A)-1 {
            B := make([]int, len(A))
            copy(B, A)
            result = append(result, B)
            return
        }
        for j := i; j < len(A); j++ {
            A[i], A[j] = A[j], A[i]
            directedPermutations(i + 1)
            A[i], A[j] = A[j], A[i]
        }
    }
    directedPermutations(0)
    return result
}

以下是结果:

16.3_generate_permutations$  go run main.go
input:  [1 2 3]
[[1 2 3] [1 3 2] [2 1 3] [2 3 1] [3 2 1] [3 1 2]]

具体地说,我对为什么在递归情况之前和之后 交换值感到困惑。我经过调试器,发现对于每个连续的调用值都被交换以生成排列。

在递归之前交换并在之后交换回是一种常见模式吗?

0 个答案:

没有答案