doutanggun9816 2017-02-03 15:54
浏览 40
已采纳

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条回答 默认 最新

  • dongyied24121 2017-02-03 16:18
    关注

    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
    }
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)