我在教科书,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));
}
有人可以解释如何从迭代转换为递归吗?谢谢。
答案 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
。