我正在尝试学习Java中的递归,并且有一个连续输入的数组,直到Scanner读入0。
从那里我有一个方法(尝试)使用递归计算数组中的正整数。这是我写过的第一个递归函数,我不断收到stackoverflow错误。
我已阅读过教程,但仍然无法理解递归的基本理解。
public class reuncF {
private static int start = 0;
private static int end = 98;
public static void main(String[] args) {
input = input.nextDouble();
list[i] = numInput;
computeSumPositive(numList, count);
}
}
return positives += solve(numbers, count++);
}
}
答案 0 :(得分:1)
你忘了停止你的递归!
必须有一些情况computeSumPositive
返回而再次调用自己。否则它会永远继续下去,永远不会回到你身边。
如果您使用循环执行此操作,则循环将如下所示:
int positives = 0;
for (int i = 0; i < numList.length; ++i) {
if (numList[i] > 0) {
positives++;
}
}
要以递归方式执行此操作,您只需找出循环中使用的变量。它们是i
,numList
和positives
。
computeSumPositive(int i, double[] numList, int positives)
然后我们来看看循环的作用。首先,它检查我们是否走得太远, 所以我们的递归函数也应该这样做。它必须返回而不是像循环那样只是摔倒。显然,它必须返回结果:
{
if (! (i < numList.length))
return positives;
然后循环执行测试并可能递增positives
,因此递归函数也应该这样做:
if (numList[i] > 0) {
positives++;
}
在循环结束时,i
已更新:
i++;
循环刚刚重新开始,但递归函数必须调用自身。当然,我们希望它使用i
和positives
的新值,但幸运的是我们更新了这些值,所以现在我们可以这样做:
return computeSumPositives (i, numList, positives);
}
棘手的一点是,值i
,numList
和是每次调用的本地。 computeSumPositives
的每次调用只能看到它给出的参数。如果它更改它们,则其他调用都不会看到该更改。
编辑:因此,如果由于我们只能推测的原因,我们希望绝望地 computeSumPositive
只能获取2个参数,我们就必须&#34;拆分&#34 ;每次调用都positives
。每次调用都知道其编号是否为正数;我们所要做的就是添加它们。然后它看起来像这样:
computeSumPositive(int i, double[] numList)
{
if (! (i < numList.length))
return 0; // I didn't find any at index i
if (numList[i] > 0) {
// Theres one I found + however many my later
// invocations will find.
return 1 + computeSumPositive (i+1, numList);
} else {
// I didn't find any, but my later invocations might.
return computeSumPositive (i+1, numList);
}
}
答案 1 :(得分:0)
我发现在处理递归时,首先找出终止案例是有帮助的。
看起来你正在将'count'视为索引。所以你可以检查你是否在数组的最后一个索引,如果是这样,如果值为正,则返回1,如果值为非正,则返回0 - 不再递归。
如果你不在最后一个索引,并且值为正,则返回1 +递归函数调用,或者如果该值为非正数,则继续递归。
这仍然会导致大型阵列的堆栈溢出。
答案 2 :(得分:-1)
count++
的值与count
的值相同;程序使用该值,然后递增它。但结果是computeSumPositive
一直用count
的相同值调用自身,这会导致无限递归。请注意,每次computeSumPositive
调用另一个computeSumPositive
时,每个调用都有自己的参数副本(如count
)和局部变量;因此,递增一个computeSumPositive
的{{1}}副本对其他递归调用使用的count
的值没有影响。
将count
更改为count++
,并添加停止递归的方法。 (在某些时候,你将调用count + 1
来查看零整数,此时,它应该返回0而不是自己调用。你需要考虑:你如何测试你是否&#39;到达那一点?)