我有一个理解代码递归的问题,我试图画树跟随,但有些事情对我来说并不清楚。 有人可以帮我理解代码片段,并在页面上绘制,或绘制或任何其他软件,递归树,以便我可以完全理解代码。
为什么有两次递归? 我不明白第二次递归是如何工作的(在||之后)。
public static boolean hasSum(int[] array, int start, int sum) {
if (sum == 0)
return true;
if (start > array.length - 1)
return false;
return hasSum(array, start + 1, sum - array[start])
|| hasSum(array, start + 1, sum);
}
非常感谢您的帮助
答案 0 :(得分:2)
搜索到的子集总和(即sum
)可以包含当前元素(array[start]
)或(因此||
)不包含当前元素
如果它包含array[start]
,我们应该找到从索引start+1
开始的子数组的子集,其总和为sum - array[start]
。
这由hasSum(array, start + 1, sum - array[start])
处理。
如果它不包含array[start]
,我们应该找到从索引start+1
开始的子数组的子集,其总和为sum
(即,因为当前元素不参与总和,我们必须在较小的数组中找到相同的总和。
这由hasSum(array, start + 1, sum)
处理。
因此有两个递归调用。