输出是正确的,但它会不时地在因子的末尾显示-1
(无限循环)。我知道递归方法中的while
循环有问题,但我不知道它是什么。在得到最终答案后如何停止递归调用?我应该使用什么而不是while
循环?
public static void main() {
int num;
System.out.print("\fInput:");
num = kb.nextInt();
int temp = 1;
factors(num, temp);
}
public static void factors(int num, int temp) {
int count = 2;
while (temp != num) {
if ((num % count) == 0) {
System.out.print(count + " * ");
factors(num / count, temp * count);
} else
count++;
}
}
答案 0 :(得分:1)
首先,你不需要在这里递归。如果您使用递归,即使您已经检查了更大的值,也始终会使用count = 2
开始新的。
所以,而不是
factors(num/count, temp*count);
我会用
num = num/count;
其次,正如阿提拉已经说过的那样,你不需要temp参数,你需要的真正检查是num != 1
是否为真。
如果你真的想要使用递归,那么会有更好的方法:将方法factors
传递给计数器,这样你就不必总是从2开始。在这种情况下,你不要&# 39;不需要任何循环:
public static void main()
{
int num;
System.out.print("\fInput:");
num=kb.nextInt();
int count=2;
factors(num, count);
}
public static void factors(int num, int count)
{
if (num == 1)
return;
if((num%count)==0)
{
System.out.print(count+ " * ");
factors(num/count, count);
}
else
factors(num,count+1);
}
}
答案 1 :(得分:0)
你的停止条件(temp!= num)永远不会是假的。 当你得到最终因素并且想要停止时,你会调用因子(1,"原始数字"),因此while循环将继续。
你应该尝试:
{{1}}
不需要temp参数。
答案 2 :(得分:0)
正如其他人指出的那样,while (temp!=num)
永远不会是false
,程序将继续无休止地循环。 Karl_Costa的解决方案运行良好,但是,您仍然可以使用while循环进行计数,如图所示。正如其他人所指出的,没有必要使用temp
。
这是另一个有效的解决方案 -
public static void main() {
int num;
System.out.print("\fInput:");
num=kb.nextInt();
System.out.print("1"); // To always print 1 as a factor.
factors(num, 2);
}
public static void factors(int num, int count) {
while(num%count != 0 && num>count) {
count++;
}
System.out.print(" * " + count);
if(num==count) {
return;
}
if(num%count==0)
factors(num/count, count);
else {
factors(num/count, count+1);
}
}
答案 3 :(得分:-1)
class RecursiveFactors
{
static void factors(int a, int n)
{
if(n%a == 0)
{
System.out.println(a);
}
if(a<=n)
factors(a+1, n);
}
public static void main(String args[])
{
factors(1,25);
}
}