第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

同時計數(shù)樹葉

同時計數(shù)樹葉

Go
瀟瀟雨雨 2021-04-07 14:15:21
我想使用并發(fā)模型來編寫一個函數(shù),以防輸入太大而并行處理會更有效,但是它永遠(yuǎn)不會結(jié)束。假設(shè)有一個struct定義為:type Tree struct {    Name     string   `json:"name"`    SubTrees []*Tree  `json:"subTrees,omitempty"`    Leaves   []string `json:"leaves"`}我想寫一個函數(shù)來計算Leaves整個遞歸結(jié)構(gòu)的總數(shù)。這很容易通過以下方式進(jìn)行遞歸:func (tree *Tree) CountLeaves() int {    curr := len(tree.Leaves)    for _, s := range tree.SubTrees {        curr += s.CountLeaves()    }    return curr}很好,一切都很好,但是如果結(jié)構(gòu)太大,效率將會很低,所以我想將其重構(gòu)為并發(fā)并使用通道。這是我嘗試進(jìn)行重構(gòu)的嘗試: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    }}目前,我可以通過計算當(dāng)前總數(shù)所需的通道收集所有數(shù)字,Leaves但函數(shù)永無止境。-1來自根Tree結(jié)構(gòu)的終止值永遠(yuǎn)不會通過通道推送或接收,我也不知道為什么。有任何想法嗎?
查看完整描述

1 回答

  • 1 回答
  • 0 關(guān)注
  • 275 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號