次の問題はコーディングバットからのものです: int の配列が与えられた場合、グループの合計が指定されたターゲットになるように、いくつかの int のグループを選択することは可能ですか?
サイトの作成者は、次のソリューションを提供しています。
public boolean groupSum(int start, int[] nums, int target) {
if (start >= nums.length) return (target == 0);
if (groupSum(start + 1, nums, target - nums[start])) return true;
if (groupSum(start + 1, nums, target)) return true;
return false;
}
nums=[2,4,8] で groupSum(0,nums,10) と呼ばれる次のケースを試したいとします。
とgroupSum(0,nums,10)
が呼び出されることがわかりました。groupSum(1,nums,10)
groupSum(1,nums,8)
groupSum(1,nums,10)
通話groupSum(2, nums,10)
とgroupSum(2, nums,6)
groupSum(1,nums,8)
通話groupSum(2,nums,8)
とgroupSum(1,nums,4)
等...
コードを調べてみると、次の呼び出しが表示されます。
groupSum(3,nums,10)
groupSum(3,nums,2)
groupSum(3,nums,6)
groupSum(3,nums,-2)
groupSum(3,nums,8)
groupSum(3,nums,0)
groupSum(3,nums,4)
groupSum(3,nums,-4)
最初の行のために trueをgroupSum(3,nums,0)
返すはず
if (start >= nums.length) return (target == 0);
ですが、 のような他の呼び出しについて混乱していますgroupSum(3,nums,-4)
。最初の行から、それは明らかに false になるはずtarget != 0
です。
また、return trueステートメントが必要な理由を誰かが説明できますか
if (groupSum(start + 1, nums, target - nums[start])) return true;
最初の行で真偽が決まると思っていました。
if (groupSum(start + 1, nums, target)) return true;