2016-05-13 25 views
0

Ich arbeite derzeit an einem Algorithmus zur Ausgabe aller Permutationen mit einer Folge von n ganzen Zahlen und diese Funktion funktioniert gut bis 6 Elemente, aber wenn es mehr ist, habe ich die StackOverflowError Nachricht . Ich habe einige Fragen zu diesem Thema gelesen, aber was ich herausgefunden habe ist, dass es passiert, wenn die rekursive Methode unendlich viele Aufrufe hat und dies scheint nicht der Fall zu sein, da der Basisfall ausgeführt wird.java.lang.StackOverflowError in einer rekursiven Methode

//int[] c parameter receives an array with n elemens to permute 
//int i represents the length of the sequence to permute (ai,...,aN) 
public boolean isPermutated(int[] c, int i) 
{ 
    int max = 0; // the maximum number from a sequence (a1,...,aN) and 
    int index = 0; // the index where the maximum is 
    int lessThan; // an index preceded by maximum 
    //Base case 
    if(i == 1) 
    { 
     return false; 
    }   
    // Gives the Maximum element from a sequence (ai,...,aN) 
    for(int count = c.length - i; count < c.length; count++) 
    { 
     if(max < c[count]) 
     { 
      max = c[count]; 
      index = count; 
     } 
    } 
    // Swap the Maximum from index to index-1 
    if(max != c[c.length - i]) 
    { 
     lessThan = c[index-1]; 
     c[index-1] = max; 
     c[index] = lessThan; 
     //move each maximum from a sequence (a,...,aN) to the last index ex, (3,2,1)->(2,1,3) 
     if(i != c.length) 
     { 
      while((i-c.length) != 0) 
      { 
       for(int count = c.length - (i+1); count < c.length-1; count++) 
       { 
        int before; 
        int after; 
        before = c[count]; 
        after = c[count+1]; 
        c[count] = after; 
        c[count+1] = before;  
       } 
       i++; 
      } 
     } 

     // print array c elements  
     for(int e:c) 
      System.out.print(e); 
     System.out.println(); 
     isPermutated(c, c.length);  
    } 
    else 
    { 
     i--; 
     isPermutated(c, i);   
    } 
    return true; 
} 

Ich bin nur frustriert, wie ich es brauche mit einem Array von 10 Elementen. Gibt es einen Pseudocode mit der gleichen Methodensignatur oder gibt es eine Möglichkeit, den Stack-Trace zu optimieren, da dies das Problem teilweise lösen sollte?

+0

Code hinzufügen, der Fehler verursacht, bitte – maxpovver

+1

Ihre Annahmen über das, was passiert, entsprechen nicht der Realität. Machen Sie eine Drehung durch den Code in einem Debugger und sehen Sie, warum es passiert. Besser noch, fange an, Junit-Tests zu schreiben, die die Klasse trainieren und Komplexität aufbauen. – duffymo

+2

Stack Overflows passieren, wenn der Call-Stack überflogen wird, was durch eine endliche Anzahl von Anrufen verursacht wird, nicht durch eine unendliche Anzahl von Anrufen. – SamTebbs33

Antwort

3

Verpasst der Code keine Return-Anweisungen? Warum rufen Sie isPermutated auf, ohne sich Gedanken über den neu erstellten Wert zu machen?

Ihr Code wird nie wahr zurückgegeben.

Verwandte Themen