java - 如果递归函数不在循环中,则当索引大于某个数字时获取 StackOverflowError

标签 java recursion stack-overflow

如果下面的代码不在 for() 循环中,我很难理解为什么当我的“n2”值超过 7853 时我会收到 StackOverflowError。

代码如下:

package tp3;

import java.util.Date;
public class TP3 {



//Somme des fractions Récursive
public static double somFractionsRecursive(double index) throws IllegalArgumentException{
    if (index == 0) throw new IllegalArgumentException("Erreur: impossible de diviser par zéro");
    if (index == 1) return 1/index;

    double reponse = (1/index) + somFractionsRecursive(index-1);


    return reponse;
}

//Somme des fractions itérative
public static double somFractionsIterative(double index) throws IllegalArgumentException{
if (index == 0) throw new IllegalArgumentException("Erreur: impossible de diviser par zéro");
double reponse = 0;
for (double i = 1; i <= index; i++) {
 reponse += 1/i ;
}
    return reponse;
}


public static void main(String[] args) {
    Date d = new Date();


    double n1 = 999, n2 = 7853;

    System.out.println("\n\nTemps requis pour trouvers somFraction("+n1+") en récursivité: ");
    d = new Date();
    long debut = d.getTime();
    System.out.println("somFractionsRecursive("+n1+") = " + somFractionsRecursive(n1));
    d = new Date();
    long fin = d.getTime();
    System.out.println("Terminé! Temps requis: "+((fin-debut))+" milisecondes");


    System.out.println("\n\nTemps requis pour trouvers somFraction("+n2+") en récursivité: ");
    d = new Date();
    debut = d.getTime();
    System.out.println("somFractionsRecursive("+n2+") = " + somFractionsRecursive(n2));
    d = new Date();
    fin = d.getTime();
    System.out.println("Terminé! Temps requis: "+((fin-debut))+" milisecondes");


    System.out.println("\n\nTemps requis pour trouvers somFraction("+n1+") en itération: ");
    d = new Date();
    debut = d.getTime();
    System.out.println("somFractionsIterative("+n1+") = " + somFractionsIterative(n1));
    d = new Date();
    fin = d.getTime();
    System.out.println("Terminé! Temps requis: "+((fin-debut))+" milisecondes");


    System.out.println("\n\nTemps requis pour trouvers somFraction("+n2+") en itération: ");
    d = new Date();
    debut = d.getTime();
    System.out.println("somFractionsIterative("+n2+") = " + somFractionsIterative(n2));
    d = new Date();
    fin = d.getTime();
    System.out.println("Terminé! Temps requis: "+((fin-debut))+" milisecondes");

  }// End Main
}// End TP3 Class

但是,我将最后一段代码放入 for() 循环中,我可以毫无问题地获取高达 9999 的“n2”变量

以下代码不会给我一个 StackOverflowError:

 // Functions are the same as above...
 System.out.println("\n\nTemps requis pour trouvers somFraction("+n1+") en itération: ");
    d = new Date();
    debut = d.getTime();
    for (int i = 1; i <= n1; i++) {
        System.out.println("somFractionsIterative("+i+") = " + somFractionsIterative(i));
    }
    d = new Date();
    fin = d.getTime();
    System.out.println("Terminé! Temps requis: "+((fin-debut))+" milisecondes");


    System.out.println("\n\nTemps requis pour trouvers somFraction("+n2+") en itération: ");
    d = new Date();
    debut = d.getTime();
    for (int i = 1; i <= n2; i++) {
        System.out.println("somFractionsIterative("+i+") = " + somFractionsIterative(i));
    }
    d = new Date();
    fin = d.getTime();
    System.out.println("Terminé! Temps requis: "+((fin-debut))+" milisecondes");

抱歉搞得一团糟,我对此很陌生! 并感谢您一如既往的帮助:)

最佳答案

递归每次迭代都会调用该方法,而迭代则不会。由于您正在进行新方法调用,因此会创建新的堆栈帧并将其推送到堆栈上。如果你正在迭代,你可能会永远(无限循环),而使用递归,你会不断消耗更多的内存。本教程可以帮助您理解堆栈。 http://www.javatutorialhub.com/java-stack-heap.html

关于java - 如果递归函数不在循环中,则当索引大于某个数字时获取 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15752393/

相关文章:

java - 如何在一个数组中打印数组函数?

haskell - 为什么这个解决 "queens"困境的解决方案在 Haskell 中比其他解决方案运行得慢得多?

python - 递归函数计算是否 11 除以一个数

c# - 如何跟踪.NET中StackOverflowException的原因?

java - 通过 scala 处理深度优先迭代时出现 stackoverflowerror

java - 如何使用 JCheckBox 启用/禁用 JTextField?或者我的代码有什么问题?

java - 清除数据后从共享偏好中获取值(value)

java - 从 AlertDialog 输入向 RecyclerView 添加项目

C 递归函数 - GCD

.net-core - ASP.NET Core 2.1 - 与依赖注入(inject)相关的堆栈溢出异常