当我使用递归获得超过 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) 表示,其中 p2^p-1 是质数。然而,话虽如此,您几乎肯定无法使用递归或循环技术计算出 8 个完全数,更不用说 30 个了,这仅仅是因为数字很快就会变得太大。