java - 当我使用递归获得超过4个完全数JAVA时出错

标签 java recursion runtime-error stack-overflow perfect-numbers

我使用递归算法计算 30 个完美数,但只计算前 4 个,然后程序抛出错误。

enter image description here

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/

相关文章:

检查数组的排序

java - Java 中的偶数

java - 在命令提示符下运行 java 代码时出现问题

java - 如何高效存储大型Java map ?

java - 以有效的方式循环遍历 ResultSet 并将列值添加到 List<String>

java - HttpClient 、 httppost 和负载

java - Tomcat 在 https 中编码重定向

java - 递归地将文件添加到 JList - 仅添加最后一个文件夹中的文件

vb6 - InvokeMember 单击 VB6 时出现运行时错误 438

c - 用于查找素数的埃拉托色尼筛算法的上限使程序停止工作