当我使用递归获得超过 4 个完全数时出错 JAVA
Error when I use recursion to get more than 4 perfect numbers JAVA
我正在使用递归算法计算 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 通常是可行的。
我精确 "two parameters" 因为堆栈的大小对 JVM 接受的嵌套调用的数量很重要。
但是从某种程度的嵌套调用,JVM 抛出一个 Error
: java.lang.WhosebugError
定义为 :
Thrown when a stack overflow occurs because an application recurses
too deeply.
而且33550336
嵌套的调用肯定太多了。
该算法可能是正确的,但您应该支持循环而不是递归,以防止堆栈溢出。
第 5 个完美数太大,以致于达到它所需的递归次数导致 WhosebugError。手动检查每个数字在技术上是可行的,但远非最佳,因为即使是第 5 个完美数字也是 33550336,这将花费比合理计算时间更长的时间。一种更有效的技术是检查数字是否可以用 2^(p-1)*(2^p-1)
表示,其中 p
和 2^p-1
是质数。然而,话虽如此,您几乎肯定无法使用递归或循环技术计算出 8 个完全数,更不用说 30 个了,这仅仅是因为数字很快就会变得太大。
我正在使用递归算法计算 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 通常是可行的。
我精确 "two parameters" 因为堆栈的大小对 JVM 接受的嵌套调用的数量很重要。
但是从某种程度的嵌套调用,JVM 抛出一个 Error
: java.lang.WhosebugError
定义为 :
Thrown when a stack overflow occurs because an application recurses too deeply.
而且33550336
嵌套的调用肯定太多了。
该算法可能是正确的,但您应该支持循环而不是递归,以防止堆栈溢出。
第 5 个完美数太大,以致于达到它所需的递归次数导致 WhosebugError。手动检查每个数字在技术上是可行的,但远非最佳,因为即使是第 5 个完美数字也是 33550336,这将花费比合理计算时间更长的时间。一种更有效的技术是检查数字是否可以用 2^(p-1)*(2^p-1)
表示,其中 p
和 2^p-1
是质数。然而,话虽如此,您几乎肯定无法使用递归或循环技术计算出 8 个完全数,更不用说 30 个了,这仅仅是因为数字很快就会变得太大。