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?
中以惯用方式编写它答案 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
}