【发布时间】:2015-03-08 22:16:00
【问题描述】:
我需要编写一个方法,将数字递归分解为 1234567890,我当前的应用程序在抛出 StackOverflowError 之前只处理小数字。我知道我的问题是递归调用太多,但我不知道如何减少我的调用次数。
它需要是递归的。
我认为解决方案与我的算法背后的数学有关。我看过不同的迭代解决方案,但我似乎无法用更少的调用来递归地执行它。代码:
public static boolean isPrime(int input, int i) {
if (i <= 2) {
return true;
}
if (input % i != 0) {
return isPrime(input, i-1);
} else {
factors(input, i);
return false;
}
}
public static void factors(int input, int i) {
if (i <= 1) {
System.out.printf(" %d", 1);
} else {
if (input % i == 0) {
System.out.printf(" %d", i);
}
factors(input, i - 1);
}
}
并且开始于:
System.out.println("What integer would you like to factor?");
num1 = scan.nextInt();
if(isPrime(num1, num1 - 1)){
System.out.println("Input is a prime number");
} else {
System.out.println(" factors\nInput isn't a prime number.");
}
【问题讨论】:
-
如何开始这个方法?你能提供一些例子吗?您是否必须使用递归,因为这可以在完全没有递归的情况下完成。我建议您使用实际代码,因为这仍然无法编译。
-
我添加了使用它的部分,它应该也可以工作。它必须是递归的。
-
试试
isPrime(num1, (int) Math.sqrt(num1))它将有 N^0.5 而不是 N 的深度。如果你需要两者,你可以打印出i和n / i作为因子。 -
它需要处理大数字(10 位),但它会在 ~6000 次迭代后抛出 stackoverflow。
-
简单的解决方案是使用堆栈深度为 1 或 2 的迭代。如果您还必须使用迭代来避免某些递归深度,我不清楚使用递归的意义何在。
标签: java recursion stack-overflow