理解Java中的基本递归函数来计算数组中的正整数

时间:2014-04-02 22:04:59

标签: java recursion

我正在尝试学习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++);
    }
}

3 个答案:

答案 0 :(得分:1)

你忘了停止你的递归!

必须有一些情况computeSumPositive返回再次调用自己。否则它会永远继续下去,永远不会回到你身边。

如果您使用循环执行此操作,则循环将如下所示:

int positives = 0;
for (int i = 0; i < numList.length; ++i) {
    if (numList[i] > 0) {
       positives++;
    }
}

要以递归方式执行此操作,您只需找出循环中使用的变量。它们是inumListpositives

computeSumPositive(int i, double[] numList, int positives)

然后我们来看看循环的作用。首先,它检查我们是否走得太远, 所以我们的递归函数也应该这样做。它必须返回而不是像循环那样只是摔倒。显然,它必须返回结果:

{
    if (! (i < numList.length)) 
        return positives;

然后循环执行测试并可能递增positives,因此递归函数也应该这样做:

    if (numList[i] > 0) {
        positives++;
    }

在循环结束时,i已更新:

    i++;

循环刚刚重新开始,但递归函数必须调用自身。当然,我们希望它使用ipositives的新值,但幸运的是我们更新了这些值,所以现在我们可以这样做:

    return computeSumPositives (i, numList, positives);
}

棘手的一点是,值inumList是每次调用的本地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;到达那一点?)