2016-06-21 199 views
1

我有一个理解递归代码的问题,我试图画出树跟随,但有些东西对我来说还不清楚。 有人可以帮助我理解代码片段,并在页面上绘制,或绘制或任何其他软件,递归树,以便我可以完全理解代码。Java - SubSet和递归递归递归图

为什么会有两个递归? 我不明白第二次递归如何工作(在||之后)。

Example painted tree

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); 

} 

非常感谢您的帮助

回答

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)处理。

因此这两个递归调用。

+0

谢谢你可以给我画吗? – liran

+0

@liran你是什么意思“画我”? – Eran

+0

在声明中,我附上了一张图片,图片画出了所有递归调用。 如果你能把我引到页面,我会很高兴,因为我只按照正确的顺序绘制这些步骤。 我相对开始于java 而我仍然需要了解代码 谢谢 – liran