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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

理解這個(gè)遞歸組合生成器

理解這個(gè)遞歸組合生成器

Helenr 2023-07-20 17:13:50
我發(fā)現(xiàn)這段代碼用于生成 n 選擇 k 組合的生成器函數(shù),但我不太理解它。有人可以幫我用簡單的英語解釋其背后的步驟嗎?謝謝。const combinations = function*(elements, length) {  for (let i = 0; i < elements.length; i++) {    if (length === 1) {      yield [elements[i]];    } else {      let remaining = combinations(elements.slice(i + 1, elements.length), length - 1);      for (let next of remaining) {        yield [elements[i], ...next];      }    }  };}
查看完整描述

1 回答

?
繁星淼淼

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊

理解這樣的遞歸情況的典型方法是假設(shè)它適用于較小的情況,然后看看較大的情況如何進(jìn)行。

因此,讓我們假設(shè)combinations(['b', 'c', 'd'], 1)產(chǎn)生值['b']、then ['c']、then '[d]',同樣combinations(['c', 'd'], 1)產(chǎn)生['c']then ['d'],然后combinations(['d'], 1)產(chǎn)生 just ['d'],最后combinations([], 1)什么也不產(chǎn)生。

現(xiàn)在讓我們來看看combinations(['a', 'b', 'c', 'd'], 2)

我們迭代ifrom03

  • 當(dāng)i0elements[i]='a'時(shí),我們看到length2,所以不是== 1。我們計(jì)算remaining  = combinations(['b', 'c', 'd'], 1),根據(jù)我們的假設(shè),得出['b']then 。因此,對(duì)于其中的每一個(gè),我們都會(huì)屈服,這意味著我們屈服,然后['c']['d'][elements[i], ...(the yielded value)]['a', 'b']['a', 'c']['a', 'd']

  • 當(dāng)i1elements[i]='b'時(shí),我們看到 是length2所以不是== 1。然后我們計(jì)算remaining = combinations(['c', 'd'], 1),根據(jù)我們的假設(shè),得出。因此,對(duì)于其中的每一個(gè),我們都會(huì)產(chǎn)生,這意味著我們會(huì)產(chǎn)生,然后。['c']['d'][elements[i], ...(the yielded value)]['b', 'c']['b', 'd']

  • 當(dāng)i2elements[i]='c'時(shí),我們看到length2,所以不是== 1。我們計(jì)算出remaining = combinations(['d'], 1)根據(jù)我們的假設(shè)得出的結(jié)果['d']。因此,對(duì)于其中(唯一的)一個(gè),我們產(chǎn)生 ,這[elements[i], ...(the yielded value)]意味著我們產(chǎn)生['c', 'd']。

  • 當(dāng)i=時(shí)3,elements[i]='d'我們看到是length2所以不是== 1。我們計(jì)算“剩余=組合([],1),根據(jù)我們的假設(shè),它不會(huì)產(chǎn)生任何結(jié)果,因此在這種情況下我們也不會(huì)產(chǎn)生任何結(jié)果。

因此,總的來說,我們得到了以下值:['a', 'b']、['a', 'c']、['a', 'd']['b', 'c']、['b', 'd']['c', 'd'],這正是 中兩個(gè)元素的組合集合['a', 'b', 'c', 'd']。

length當(dāng)然,您還需要在=時(shí)檢查基本情況1,但這應(yīng)該很容易做到。

非發(fā)電機(jī)方法

有時(shí),生成器方法會(huì)使代碼更加簡潔且易于理解。然而,這并不是真正的那個(gè)時(shí)代。

基本上,生成器允許您不必進(jìn)行復(fù)雜的結(jié)果收集,而是yield隨心所欲地收集結(jié)果。如果您可以輕松地收集結(jié)果,那么非生成器代碼通常會(huì)更簡單。這是不使用生成器的相同算法:

const combinations = (elements, length) => 

  elements .flatMap ((el, i) => 

    length == 1

      ? [el]

      : combinations (elements .slice (i + 1), length - 1) 

          .map (combo => [el, ...combo])

  )

  

console .log (combinations (['a', 'b', 'c', 'd'], 2))

.as-console-wrapper {max-height: 100% !important; top: 0}


查看完整回答
反對(duì) 回復(fù) 2023-07-20
  • 1 回答
  • 0 關(guān)注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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