以下問題來自codingbat:給定一個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)
我看到groupSum(3,nums,0)
應該返回true,因爲第一行:
if (start >= nums.length) return (target == 0);
但我很困惑其他電話,如groupSum(3,nums,-4)
。從第一行開始,它應該明顯導致錯誤,因爲target != 0
。
也有人解釋爲什麼迴歸真實的陳述是必要的,
if (groupSum(start + 1, nums, target - nums[start])) return true;
我想的第一行會確定真假。
if (groupSum(start + 1, nums, target)) return true;
這是遞歸!你期望它有意義嗎? –
我期望groupSum(3,nums,4)沒有被groupSum(3,nums,0)調用,但是從另一個更早的調用中調用。您可以添加第四個變量來查看被調用者 - 爲每個調用添加start +'_'+ target,然後將其打印出來以查看其來源。 – AngelWarrior