你好,我想了解這個解決方案組合總和。如何理解這個遞歸
function combinationSum(candidates, target) {
var result = [];
if ((candidates == null) || (candidates.length == 0)) {
return result;
}
var cur = [];
candidates = candidates.sort((a, b) => a - b)
csh(candidates, target, cur, result, 0);
return result;
};
function csh(cand, target, cur, result, j) {
//console.log(cur);
if (target == 0) {
var temp = cur.slice();
result.push(temp);
return;
}
for (var i = j; i < cand.length; i++) {
if (target < cand[i]) {
return;
}
//console.log(cur);
cur.push(cand[i]);
console.log(cur);
csh(cand, target - cand[i], cur, result, i);
cur.pop();
}
}
https://leetcode.com/problems/combination-sum/description/
雖然我理解遞歸的基本原則,這個問題是失去了我一點點。因此,例如,對於輸入:
candidates = [2,3,6,7]
target = 7
當你第一次進入該功能cur
是空的,所以我們的第一次迭代是:
[],
[2],
[2,2]
然後我們不斷增加cand[i]
這是目前2
[2,2,2]
但是此時target = 1
小於cand[i]
這就是2
所以我們回來。而且由於我們正在返回,我們彈出堆棧,彈出最後一個2
。既然我們已經回到我們增加i
,然後我們添加3
到cur
[2,2,3]
因爲我們的目標數組等於0
我們現在再次返回,我的問題是,在這一點上我們的回頭率,直到cur
是空的並繼續像下面的功能?
[2,2]
[2]
[]
[6]
[]
[7]
我只是想了解這個功能正在做什麼。
啊好吧我想我知道你的意思,所以它做了類似[2],[2,2],[2,2,2],pop()現在[2,2,3],現在彈出[2,2,6]然後彈出現在[2,2,7]然後[3],[3,3]。[3,6],[3,7]? – motioncity
@motioncity除了'[2,2,...]'之外,它基本上是正確的,它將完成'[2,3,..]','[2,6,...]'和[ 2,7,...]'之前'[3,...]' – apsillers