亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

同時計數樹葉

同時計數樹葉

Go
瀟瀟雨雨 2021-04-07 14:15:21
我想使用并發模型來編寫一個函數,以防輸入太大而并行處理會更有效,但是它永遠不會結束。假設有一個struct定義為:type Tree struct {    Name     string   `json:"name"`    SubTrees []*Tree  `json:"subTrees,omitempty"`    Leaves   []string `json:"leaves"`}我想寫一個函數來計算Leaves整個遞歸結構的總數。這很容易通過以下方式進行遞歸:func (tree *Tree) CountLeaves() int {    curr := len(tree.Leaves)    for _, s := range tree.SubTrees {        curr += s.CountLeaves()    }    return curr}很好,一切都很好,但是如果結構太大,效率將會很低,所以我想將其重構為并發并使用通道。這是我嘗試進行重構的嘗試:func (tree *Tree) CountLeaves() int {    var wg sync.WaitGroup    ch := make(chan int)    defer close(ch)    go count(tree, true, ch, &wg)    var total int    wg.Add(1)    go func(total *int) {        for x := range ch {            fmt.Println(x)            *total += x        }        wg.Done()    }(&total)    wg.Wait()    return total}func count(t *Tree, root bool, ch chan int, wg *sync.WaitGroup) {    defer wg.Done()    ch <- len(t.Leaves)    if t.SubTrees != nil {        wg.Add(len(t.SubTrees))        for _, s := range t.SubTrees {            go count(s, false, ch, wg)        }        wg.Wait()    }    if root {        ch <- -1    }}目前,我可以通過計算當前總數所需的通道收集所有數字,Leaves但函數永無止境。-1來自根Tree結構的終止值永遠不會通過通道推送或接收,我也不知道為什么。有任何想法嗎?
查看完整描述

1 回答

  • 1 回答
  • 0 關注
  • 277 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號