Search code examples
javarecursionstack-overflow

Getting a StackOverflowError when index is larger than a certain number if recursive function is not in Loop


I'm having a hard time understanding why i'm getting a StackOverflowError when my my "n2" value is over 7853 if my code below is not in a for() loop.

Here's the code:

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

However, i put the last bit of code in a for() loop i can get the "n2" variable up to 9999 with no problems

The following code does not give me a 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");

Sorry for the mess, i'm very new to this! And thanks for your help as always :)


Solution

  • Recursion calls into the method for every iteration, whereas iteration doesn't. Since you are making a new method call a new stack frame is created and pushed on the stack. If you are iterating you could go forever (infinite loop) whereas with recursion you are continually consuming more memory. This tutorial may help you understand the stack. http://www.javatutorialhub.com/java-stack-heap.html