2017-02-03 48 views
0

今天我试着去做我的第一步。 我试图写一个函数,它创建给定列表的所有排列。 首先,我彻底失败了,所以我试图写的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])) 

走:

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]]

我真的有人可以帮助我。我真的很想知道,我在代码中做了什么错误

回答

2

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) 

     // 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 
} 

https://play.golang.org/p/oewV8iPd8E

+0

非常感谢我以为它会是这样的,但是我虽然数组的一个切片没有一个referenece到它的源 – Ced