在Golang中生成powerset的代码会产生错误的结果

时间:2017-07-23 17:30:15

标签: go

Golang中生成powerset的下一个代码会在输入{"A", "B", "C", "D", "E"}上产生错误的结果。我看到[A B C E E]是最后生成的集。

package main

import (
    "fmt"
)

func main() {
    for _, s := range PowerSet([]string{"A", "B", "C", "D", "E"}) {
        fmt.Println(s)  
    }   
}

func PowerSet(set []string) [][]string {
    var powerSet [][]string
    powerSet = append(powerSet, make([]string, 0))
    for _, element := range set {
        var moreSets [][]string
        for _, existingSet := range powerSet {
            newSet := append(existingSet, element)
            moreSets = append(moreSets, newSet)
        }
        powerSet = append(powerSet, moreSets...)
    }
    return powerSet
}

如何解决?如何在Go?

中以惯用方式编写它

3 个答案:

答案 0 :(得分:0)

例如,您可以使用如下算法:https://stackoverflow.com/a/2779467/3805062

observe({
 output$barPlot <- renderPlot({
             z %>% filter(genres == input$genre) %>%  group_by(genres, newname2)%>%summarise(value = mean(values)) %>% ggplot(aes(x = newname2, y=value, fill = newname2)) + geom_bar(stat= "identity", width = 1, show.legend = FALSE) + labs(x = "Genre") +  coord_polar() 
   })
)

答案 1 :(得分:0)

你的程序问题不是算法本身,而是这一行:

newSet := append(existingSet, element)

您不应append并指定其他变量。

作为Implement Facebook API login with reactjs 状态(强调我的),&#34;追加内置函数将元素附加到切片的末尾。 如果有足够的容量,则会重置目标以容纳新元素。如果没有,将分配一个新的底层数组。&#34;。

因此,可能会出现newSet := append(existingSet, element)实际上会修改existingSet本身的情况,这会破坏您的逻辑。

如果你改变它而不是创建一个新数组并附加到那个数组,它会按预期工作。

newSet := make([]string, 0)
newSet = append(newSet, existingSet...) 
newSet = append(newSet, element)

答案 2 :(得分:0)

阐述@ eugenioy的答案。
看看this主题。这是一个工作示例:https://play.golang.org/p/dzoTk1kimf

func copy_and_append_string(slice []string, elem string) []string {
    // wrong: return append(slice, elem)
    return append(append([]string(nil), slice...), elem)
}

func PowerSet(s []string) [][]string {
    if s == nil {
        return nil
    }
    r := [][]string{[]string{}}
    for _, es := range s {
        var u [][]string
        for _, er := range r {
            u = append(u, copy_and_append_string(er, es))
        }
        r = append(r, u...)
    }
    return r
}