Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 递归算法中的Go通道会导致重复值 起点_Algorithm_Go_Recursion_Concurrency - Fatal编程技术网

Algorithm 递归算法中的Go通道会导致重复值 起点

Algorithm 递归算法中的Go通道会导致重复值 起点,algorithm,go,recursion,concurrency,Algorithm,Go,Recursion,Concurrency,我有一个实现,用于在Go中创建集合的所有置换: 主程序包 输入“fmt” func main(){ 集合:=[]字符串{“a”、“b”、“c”} 置换(集合,len(集合)) } func置换(a[]字符串,k int){ 如果k==1{ fmt.Println(a) } 对于i:=0;i

我有一个实现,用于在Go中创建集合的所有置换:

主程序包
输入“fmt”
func main(){
集合:=[]字符串{“a”、“b”、“c”}
置换(集合,len(集合))
}
func置换(a[]字符串,k int){
如果k==1{
fmt.Println(a)
}
对于i:=0;i
输出为:

[a b c]
[b a c]
[c a b]
[a c b]
[b c a]
[c b a]
它打印出输入集的六个正确排列,因此一切正常

问题 但是现在我想将排列返回给调用者,而不是在函数中打印出来

我尝试通过将一个通道传递到函数中,然后将每个排列发送到该通道,而不是打印它:

主程序包
输入“fmt”
func main(){
集合:=[]字符串{“a”、“b”、“c”}
c:=make(chan[]字符串)
go置换(集合,len(集合),c)
对于s:=范围c{
fmt.Println(s)
}
}
func置换(a[]字符串,k int,c chan[]字符串){
如果k==1{

c这样,您将切片
a
发送到主goroutine:

  if k == 1 {
    c <- a
  }

这样,您将切片
a
发送到主goroutine:

  if k == 1 {
    c <- a
  }

这是正确的,但有误导性。你称
a
为指针,但它不是。
a
是一个片,其底层实现恰好包含指向数组的指针。我修复了帖子。
a
是一个片。这是正确的,但有误导性。你称
a
为指针,但它不是。
a
是一个片,其底层是ng实现碰巧包含一个指向数组的指针。我修复了帖子。
a
是一个片段。这不是您链接到的Wikipedia页面上算法的准确抄本。相反,它是所示“频繁错误实现”的实现。Heap的算法应始终使用k=4(至少)进行验证因为常见错误不会以任何明显的方式影响k=3的情况。感谢您指出这一点。我从某处获取了实现。它也产生了正确的结果,但效率较低。但结果不正确。Heap的算法产生了连续排列,仅在两个元素的一次交换中不同。不正确的ct实现不满足此要求。这不是您链接到的Wikipedia页面上算法的准确转录。相反,它是所示“频繁错误实现”的实现。Heap的算法应始终使用k=4(至少)进行验证因为常见错误不会以任何明显的方式影响k=3的情况。感谢您指出这一点。我从某处获取了实现。它也产生了正确的结果,但效率较低。但结果不正确。Heap的算法产生了连续排列,仅在两个元素的一次交换中不同。不正确的ct实施不满足此要求。
if k == 1 {
   x := make([]string, len(a))
   copy(x,a)
   c <- x
}