お世話になっております。
Codewars、というサイトを使ってJavaScriptを学習中のものです。
[50, 55, 56, 57, 58]のような数字をその要素とするリストからk個選び、その合計がt以下になる組み合わせのうち、合計値が最大のものを求めよ、という課題がありました。
function chooseBestSum(t, k, ls) { var biggestCount = 0; var recurseTowns = function(townsSoFar, lastIndex) { // console.log(townsSoFar) townsSoFar = townsSoFar || []; //base case if (townsSoFar.length === k) { var sumDistance = townsSoFar.reduce((a,b)=>a+b); if (sumDistance <= t && sumDistance > biggestCount) { biggestCount = sumDistance; } return; //EJECT } //recursive case for (var i = lastIndex + 1 || 0; i < ls.length; i++) { recurseTowns(townsSoFar.concat(ls[i]), i); } } recurseTowns(); return biggestCount || null; } var ls = [50, 55, 56, 57, 58]; console.log(chooseBestSum(163, 3, ls))//163
この関数を実行すると、
recurseTowns([50],0)
recurseTowns([50,55],1)
recurseTowns([50,55,56],2)
のようにスタックが増えていき、
まずrecurseTowns([50,55,56],2)がreturnを実行すると思います。
このあと
recurseTowns([50,55],1)に移ると思うのですが、
for (var i = lastIndex + 1 || 0; i < ls.length; i++) {
recurseTowns(townsSoFar.concat(ls[i]), i);
}
ここで"i = lastIndex + 1"となっているため、i = 2 となってしまい、またrecurseTowns([50,55,56],2)がまた実行されてしまうのでは、と考えてしまいます。
まずrecurseTowns([50,55,56],2)がreturnを実行した後の挙動はどのようなものになるのでしょうか?
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー