2017-02-03 10 views
0

今日私は最初のステップをやってみました。 私は与えられたリストのすべての順列を作成する関数を書こうとしました。 まず、私は完全に失敗したので、私は、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のバージョンは、While [1,2,3]、[2,3,1]、[2,3,1,2]は、この出力を作成します:

[1,2,3] 、[3、 2、1]]

外出バージョンがこれを作成します。

[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