我将阅读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]]
具体地说,我对为什么在递归情况之前和之后 交换值感到困惑。我经过调试器,发现对于每个连续的调用值都被交换以生成排列。
在递归之前交换并在之后交换回是一种常见模式吗?