将迭代转换为递归

时间:2017-02-27 21:05:13

标签: java recursion

我在教科书,YouTube和在线发现的工作表的帮助下自学AP计算机科学A.其中一个工作表是递归,并要求我将下面的代码转换为递归,但是,教科书或YouTube都无法解释如何从迭代转换为递归。

public static int iterative(int x){
        int count=0;
        int factor=2;
        while(factor<x){
            if(x%factor==0)
                count++;
            factor++;
        }
        return count;
    }

下面的代码是我的尝试,但我不断收到StackOverFlowError。

    public static int recursion(int x){
    int count=0;
    int factor=2;
    if(factor>x)
        return count;
    else if(x%factor==0){
        factor++;
        count++;
    }
    return count + (recursion(x));
}

有人可以解释如何从迭代转换为递归吗?谢谢。

3 个答案:

答案 0 :(得分:2)

您需要将factor作为变量传递给方法。因此方法签名看起来像public static int recursion(int x, int factor)。因为你拥有它的方式因素总是2,因为每次调用方法时factor变量都会重置为2。

答案 1 :(得分:1)

public static int recursion(int x, int factor)
{
    int count=0;

    if(factor>x)
        return count;
    else if(x%factor==0)
    {
        ++factor;
        ++count;
    }

    return count + (recursion(x, factor));
}

唯一的区别是更改标题,删除int factor = 2,以及底部的return语句。使用递归而不是迭代时,您必须传递更多变量作为一般规则。否则,您遇到StackOverFlowError的问题源于您确实传递了更新的因子值。这导致默认情况永远不会成立,并且实际上创建了一个无限循环,只是由于调用方法资源很多并且在未达到默认情况时会抛出该错误。默认情况为:返回计数;当if语句(因子&gt; x)变为真时。

答案 2 :(得分:1)

正如JackVanier针对此特定问题所解释的那样,您必须将因子作为方法参数传递。但是公共方法签名应保持不变,因此您必须编写两个新方法:一个可公开访问,具有预期签名,另一个是真正递归的,并由另一个方法调用。

public static int recursive(int x) {
    return recursive(x, 2);
}

private static int recursive(int x, int factor) {
    if (factor >= x)
        return 0;
    if (x % factor == 0)
        return 1 + recursive(x, factor + 1);
    return recursive(x, factor + 1);
}

还值得一提的是,你需要一个打破递归的停止条件。这是你已经得到的正确的事情,factor >= x条件在任何情况下都最终类似于true