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

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

我在可視化組合和問題的遞歸調用時遇到了一些麻煩?

我在可視化組合和問題的遞歸調用時遇到了一些麻煩?

慕的地6264312 2021-06-01 09:11:05
問題是在排序數組中找到總和為給定目標值的所有唯一組合。在這個例子中,假設候選者=[2,3,6,7] 和目標=7。我看了一些視頻,現在我了解了如何解決這個問題的一般算法。我還查看了一個解決方案,但是在可視化函數中的遞歸樹/每個遞歸調用時遇到了一些麻煩。var combinationSum = function(candidates, target) {    candidates.sort((a,b) => a-b)    let result = []    combSum(candidates, target, [], result, 0)    return result };function combSum(candidates, target, current, result, idx) {    let n    for (let i = idx; i < candidates.length; i++) {        n = candidates[i]        current.push(n)        if (n === target) {            result.push([...current])        } else if (target > n) {             combSum(candidates, target-n, [...current], result, i)        }        current.pop()    } }我知道第一步是嘗試從數組中的第一個值 2 開始的組合。所以函數將嘗試 [2],然后是 [2,2],然后是 [2,2,2],此時目標是小于 n 的 1,因此它跳過 if 語句并彈出最后 2 個。pop() 方法是否隱式返回調用堆棧上的前一個函數調用?它會返回一個從未實際使用過的值 2,這是正確的嗎?沒有讓我失望的基本案例。另外,我知道由于數組已排序,我們應該知道如果像 [2,2,3,3] 這樣的東西不起作用,那么以 [2,2,3] 前綴開頭的任何其他組合也將起作用不行。我不明白代碼是如何解決這個問題的——它怎么知道“跳過”這些組合?像 [2,2,3,6] 等。編輯:真的很晚了,我在我原來的帖子中意識到我正在尋找一個不同的目標值,這增加了我的困惑......我修復了我的帖子以反映這一點。對不起?。?
查看完整描述

1 回答

?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

該答案并未涉及可視化方面,而是僅限于您對特定細節的問題。

預賽

遞歸基于這樣的思想,即在對目標求和的組合的增量構造中的任何一步,都需要針對原始目標與使用相同集合的當前部分組合之和的差異來解決原始問題的候選人。

combSum攜帶的參數含義如下:

  • candidates:要從中挑選的數字池(有序數組)

  • target: 要組合的數字(整數)

  • current: 當前正在完成的部分組合(有序數組)

  • result:到目前為止發現的組合
    (偽字典序排列的數組 - 前綴在它們的延續之后)

  • idx:candidates要在調用中使用的元素的最小索引。

在概念上candidatesidx折疊成單個實參candidates.slice(i)

遞歸中有2個不變量:

  • current表示當前完成的部分構造組合的數組中的元素是非遞減的。

  • 該序列是從左到右構建的。
    特別是,沒有遞歸調用會更改current調用時存在的元素。

候選的排序有助于避免相同序列的重復構造。請記住,在每次遞歸調用的有效候選元素是candidates.slice(i)i非遞減,并在每個遞歸級別的循環,這個層次的i起始值開始與當前值i從父級。

請注意,這僅candidates在結果組合中沒有出現重復數字時才有效,否則以該數字開頭的子序列將被多次計算產生幾個相同的結果( TrycombinationSum([1,4], 4)combinationSum([1,1,4], 4); 準確地說,如果多重性incandidates將等于每個結果的多重性......嘗試combinationSum([2,2,5], 9)combinationSum([2,5], 9)

1.遞歸基
遞歸基是這樣的n >= target...

2. 跳過'不可能'前綴 ...如果n === target,當前部分組合完成并添加到結果中。如果n > target當前的部分組合不能成功完成(候選數字只會變大,當前的已經太大了)。但是,代碼不適合這種情況(它可以if (n > target) break;在循環結束時使用語句)。

3.隱式返回 current.pop()恢復combSumstarted的當前調用的部分組合。這是它的目的。雖然技術上pop返回了一些值,但是這個值已經被使用了——它是current遞歸調用站點的頂部元素!


查看完整回答
反對 回復 2021-06-03
  • 1 回答
  • 0 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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