Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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
Concurrency 去旅游树比较不起作用?_Concurrency_Go_Channel - Fatal编程技术网

Concurrency 去旅游树比较不起作用?

Concurrency 去旅游树比较不起作用?,concurrency,go,channel,Concurrency,Go,Channel,我完成了树比较的go tour练习(#69),能够有效地比较两棵树。这是密码 package main import "tour/tree" import "fmt" // Walk walks the tree t sending all values // from the tree to the channel ch. func Walk(t *tree.Tree, ch chan int) { if t == nil {

我完成了树比较的go tour练习(#69),能够有效地比较两棵树。这是密码

    package main

    import "tour/tree"
    import "fmt"
    // Walk walks the tree t sending all values
    // from the tree to the channel ch.
    func Walk(t *tree.Tree, ch chan int) {
        if t == nil {
            return
        }
        Walk(t.Left,ch)
        ch <- t.Value
        Walk(t.Right,ch)
    }

    // Same determines whether the trees
    // t1 and t2 contain the same values.
    func Same(t1, t2 *tree.Tree) bool {
        c := make(chan int)
        c2 := make(chan int)
        go Walk(t1,c)
        go Walk(t2,c2)
        for i:= 0; i < 10; i++ {
            if <-c != <-c2 {
                return false
            }
        }
        return true
    }

    func main() {
        fmt.Println(Same(tree.New(1),tree.New(1)))
    }
而第二次呼吁步行(树。新的(1),c)打印


为什么在切换walk命令的顺序时两次调用同一函数会导致两个不同的输出?

首先,您需要了解树的属性。树的设置使左侧的数字始终小于当前节点的值。右边的数字总是更多

因此,如果你想找到最小的数字,你需要做的就是在每个节点“向左”。如果你找到最低数字的父母,你会得到第二个最低数字。倒数第二名的右子女可能是也可能不是倒数第三名。然而,如果你在每一个机会都从第二低的右边的孩子身上向左走,那么你将在第三低结束。直到遍历每个节点为止

当您对树进行
Walk()
时,实际上是在对数字进行排序

Walk(t.Left,ch)
ch <- t.Value
Walk(t.Right,ch)
步行(t.左,ch)

ch首先,您需要了解树的属性。树的设置使左侧的数字始终小于当前节点的值。右边的数字总是更多

因此,如果你想找到最小的数字,你需要做的就是在每个节点“向左”。如果你找到最低数字的父母,你会得到第二个最低数字。倒数第二名的右子女可能是也可能不是倒数第三名。然而,如果你在每一个机会都从第二低的右边的孩子身上向左走,那么你将在第三低结束。直到遍历每个节点为止

当您对树进行
Walk()
时,实际上是在对数字进行排序

Walk(t.Left,ch)
ch <- t.Value
Walk(t.Right,ch)
步行(t.左,ch)
ch看看下面的例子:

它使用了:

Perm作为n整数的一个片段返回 整数[0,n]

您看到的是一个功能:由
New
创建的每个树都是随机的。

请查看:

它使用了:

Perm作为n整数的一个片段返回 整数[0,n]


您看到的是一个特性:由
New
创建的每个树都是随机的。

也许我没有得到什么东西,但我仍然不明白,如果我第二次调用同一个函数,为什么输出会改变。无论我调用多少次,都不应该Walk(Tree.New(1),ch)=Walk(Tree.New(1),ch?这涉及到随机性。“函数树.New(k)构造了一个随机结构的二叉树”也许我没有得到什么东西,但我仍然不明白如果我第二次调用同一个函数,为什么输出会改变。不应该Walk(tree.New(1),ch)=Walk(tree.New(1),ch),不管我调用它多少次?这涉及到随机性。”函数树.New(k)构造一个随机结构的二叉树“
    7,9,10,8...
Walk(t.Left,ch)
ch <- t.Value
Walk(t.Right,ch)
ch <- t.Value
Walk(t.Right,ch)
Walk(t.Left,ch)
// New returns a new, random binary tree
// holding the values 1k, 2k, ..., nk.
func New(n, k int) *Tree {
    var t *Tree
    for _, v := range rand.Perm(n) {
        t = insert(t, (1+v)*k)
    }
    return t
}