Golang中生成功率集的代码给出错误结果
Golang中生成功率集的下一个代码在输入时产生错误的结果Golang中生成功率集的代码给出错误结果,go,Go,Golang中生成功率集的下一个代码在输入时产生错误的结果{“A”、“B”、“C”、“D”、“E”}。我将[A B C E]视为最后生成的集合 主程序包 进口( “fmt” ) func main(){ 对于uS:=范围功率集([]字符串{“A”、“B”、“C”、“D”、“E”}){ fmt.Println(s) } } func PowerSet(set[]字符串)[]字符串{ var powerSet[][]字符串 powerSet=append(powerSet,make([]字符串
{“A”、“B”、“C”、“D”、“E”}
。我将[A B C E]
视为最后生成的集合
主程序包
进口(
“fmt”
)
func main(){
对于uS:=范围功率集([]字符串{“A”、“B”、“C”、“D”、“E”}){
fmt.Println(s)
}
}
func PowerSet(set[]字符串)[]字符串{
var powerSet[][]字符串
powerSet=append(powerSet,make([]字符串,0))
对于u,元素:=范围集{
var moreSets[]字符串
对于u,现有集:=范围功率集{
新闻集:=追加(现有集,元素)
moreSets=append(moreSets,newSet)
}
powerSet=append(powerSet,moreSets…)
}
返回动力装置
}
如何修复它?如何在围棋中惯用地编写它?例如,您可以使用如下算法:
func PowerSet(原始[]字符串)[]字符串{
powerSetSize:=int(数学Pow(2,float64(len(原始)))
结果:=生成([]字符串,0,powerSetSize)
var指数int
对于索引
程序的问题不在于算法本身,而在于这一行:
newSet := append(existingSet, element)
您不应追加并将其分配给其他变量
正如(emphasis mine)所述,“append内置函数将元素追加到片的末尾。如果它有足够的容量,则重新许可目标以容纳新元素。。如果没有,则将分配一个新的底层数组。”
因此,在某些情况下,newSet:=append(existingSet,element)
实际上会修改existingSet
本身,这会破坏您的逻辑
如果您将其更改为创建一个新数组并附加到该数组中,它将按预期工作
newSet := make([]string, 0)
newSet = append(newSet, existingSet...)
newSet = append(newSet, element)
详细阐述@eugenioy的答案。
看看线程。下面是一个工作示例:
谢谢你给我一个关于谷歌群组的链接。我不应该用函数名来假设任何行为。
newSet := make([]string, 0)
newSet = append(newSet, existingSet...)
newSet = append(newSet, element)
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
}