英文:
Go language create permutations
问题
今天我尝试用Go语言迈出第一步。我试图编写一个函数,用于生成给定列表的所有排列组合。起初我完全失败了,所以我尝试先用Python编写这个函数,然后逐步将其翻译成Go语言:
Python版本:
def get_permutations(elements):
permutations = []
if len(elements) == 1:
return [elements]
for i in range(len(elements)):
for perm in get_permutations(elements[0:i] + elements[i+1:]):
permutations.append([elements[i]] + perm)
return permutations
print(get_permutations([1,2,3]))
Go版本:
func getPermutations(elements []int) [][]int {
permutations := [][]int{}
if len(elements) == 1 {
permutations = [][]int{elements}
return permutations
}
for i := range elements {
for _, perm := range getPermutations(append(elements[0:i], elements[i+1:]...)) {
permutations = append(permutations, append([]int{elements[i]}, perm...))
}
}
return permutations
}
func main() {
x := getPermutations([]int{1, 2, 3})
fmt.Print(x)
}
Python版本输出结果为:
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
而Go版本输出结果为:
[[3 3 3] [3 3 3] [3 3 3] [3 3 3] [3 3 3] [3 3 3]]
我真的希望有人能帮助我。我真的想知道,在Go代码中我做错了什么。
英文:
Today I tried to do my first steps with go.
I tried to write a function, which creates all permutations of a given list.
First I failed completely, so I tried to write the function with python and translate it step by step to go:
python:
def get_permutations(elements):
permutations = []
if len(elements) == 1:
return [elements]
for i in range(len(elements)):
for perm in get_permutations(elements[0:i] + elements[i+1:]):
permutations.append([elements[i]] + perm)
return permutations
print(get_permutations([1,2,3]))
go:
func getPermutations(elements []int) [][]int {
permutations := [][]int{}
if len(elements) == 1 {
permutations = [][]int{elements}
return permutations
}
for i := range elements {
for _, perm := range getPermutations(append(elements[0:i], elements[i+1:]...)) {
permutations = append(permutations, append([]int{elements[i]}, perm...))
}
}
return permutations
}
func main() {
x := getPermutations([]int{1, 2, 3})
fmt.Print(x)
}
While the python version creates this ouput:
> [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
The go version creates this one:
> [[3 3 3] [3 3 3] [3 3 3] [3 3 3] [3 3 3] [3 3 3]]
I really someone can help me. I really would like to know, what I've done wrong in the go code
答案1
得分: 4
getPermutations
函数在每次迭代中都会改变原始的elements
切片。在修改之前,你需要先复制该切片。
func getPermutations(elements []int) [][]int {
permutations := [][]int{}
if len(elements) == 1 {
permutations = [][]int{elements}
return permutations
}
for i := range elements {
el := make([]int, len(elements))
copy(el, elements)
// 或者通过append进行复制
// el := append([]int(nil), elements...)
for _, perm := range getPermutations(append(el[0:i], el[i+1:]...)) {
permutations = append(permutations, append([]int{elements[i]}, perm...))
}
}
return permutations
}
链接:https://play.golang.org/p/oewV8iPd8E
英文:
The getPermutations
function is mutating the original elements
slice each iteration. You need to make a copy of that slice before you modify it.
func getPermutations(elements []int) [][]int {
permutations := [][]int{}
if len(elements) == 1 {
permutations = [][]int{elements}
return permutations
}
for i := range elements {
el := make([]int, len(elements))
copy(el, elements)
// or copy via append
// el := append([]int(nil), elements...)
for _, perm := range getPermutations(append(el[0:i], el[i+1:]...)) {
permutations = append(permutations, append([]int{elements[i]}, perm...))
}
}
return permutations
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论