我使用递归算法计算 30 个完美数,但只计算前 4 个,然后程序抛出错误。
public class PerfectNumbers {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
getPerfectNumbers(1,1);
}
static void getPerfectNumbers(long out,long number) {
long total = 0;
if(out==30) {
return;
}
for ( int i=1;i<number;i++) {
if(number%i==0) {
total+=i;
}
}
if(total==number) {
System.out.println("Perfect Number "+number);
out++;
}
number++;
getPerfectNumbers(out,number);
}
}
这个算法有什么问题吗?
最佳答案
完美数字开头为:
6, 28, 496, 8128, 33550336
使用接受两个 long
参数的方法执行 8128
嵌套调用对于 JVM 通常是可行的。
我精确地定义了“两个参数”,因为堆栈的大小对于 JVM 接受的嵌套调用的数量很重要。
但从某种程度的嵌套调用来看,JVM 会抛出一个 Error
: java.lang.StackOverflowError
,其定义为:
Thrown when a stack overflow occurs because an application recurses too deeply.
而 33550336
嵌套调用肯定会太多。
该算法可能是正确的,但您应该更喜欢循环而不是递归,以防止堆栈溢出。
关于java - 当我使用递归获得超过4个完全数JAVA时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50533830/