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([]字符串

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([]字符串,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
}