Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-递归的子集和递归图_Java_Recursion - Fatal编程技术网

Java-递归的子集和递归图

Java-递归的子集和递归图,java,recursion,Java,Recursion,我在理解代码的递归时遇到了问题,我试图画出树跟随,但中途有些东西我不清楚。 请有人帮我理解代码片段,并在页面上或画图或任何其他软件上绘制递归树,以便我能够完全理解代码 为什么有两个递归? 我不明白第二个递归是如何工作的(在| |之后) 非常感谢您的帮助搜索的子集和(即和)可以包括当前元素(数组[start])或(因此|)不包括当前元素 如果它包括array[start],我们应该找到从索引start+1开始的子数组的子集,其和为sum-array[start] 这由hasSum(array,s

我在理解代码的递归时遇到了问题,我试图画出树跟随,但中途有些东西我不清楚。 请有人帮我理解代码片段,并在页面上或画图或任何其他软件上绘制递归树,以便我能够完全理解代码

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

非常感谢您的帮助

搜索的子集和(即和)可以包括当前元素(
数组[start]
(因此
|
)不包括当前元素

如果它包括
array[start]
,我们应该找到从索引
start+1
开始的子数组的子集,其和为
sum-array[start]

这由hasSum(array,start+1,sum-array[start])处理

如果它不包括
array[start]
,我们应该找到从索引
start+1
开始的子数组的子集,其和为
sum
(即,由于当前元素不参与和,我们必须在较小的数组中找到相同的和)

这由hasSum(数组,开始+1,求和)处理。


因此出现了两个递归调用。

@liran你说的“绘制我”是什么意思?在一个声明中,我附上了一张图片,图片绘制了所有递归调用。如果你能把我画到这一页,我会很高兴,因为我只按正确的顺序画步骤。我是从java开始的,我仍然需要理解代码you@liran也许我会尝试解释更多-您的代码包含两个与OR(| |)条件连接的递归调用。这意味着首先执行第一个(左)调用。如果返回true,则无需执行另一个递归调用-该方法返回true。如果返回false,则执行第二个(右)递归调用,该调用的结果由该方法返回。@li您的输入数组可能包含负元素,因此即使在某个点上和变为负,仍然可以达到所需的和(即,和仍然可以达到0)。
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);

}