2017-05-16 1 views
0

Mein Lehrer gab mir Java-Code und bat mich, es in Python umzuschreiben. Ich bin nicht um Hilfe zu bitten mit ihm Umschreiben, aber wenn ich den Code in meinen Java-Compiler eingegeben habe ich diesen Fehler:Permutations Code funktioniert nicht Java

Exception in thread "main" java.lang.StackOverflowError 
    at 
java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:449) 
at java.lang.StringBuilder.append(StringBuilder.java:136) 
at java.lang.StringBuilder.<init>(StringBuilder.java:113) 
at Permutations.perm1(Permutations.java:12) 
at Permutations.perm1(Permutations.java:4) 

Jede Hilfe wird sehr geschätzt, hier ist der Code:

public class Permutations { 
public static void perm1(String s) { 
    perm1("", s); 
} 
private static void perm1(String prefix, String s){ 
    int N=s.length(); 
    if(N==0){ 
     System.out.println(prefix); 
    }else{ 
     for(int i=0; i<N; i++){ 
      perm1(prefix+s.charAt(i)+s.substring(0, i)+s.substring(i+1, 
N)); 
     } 
    } 
} 
public static void perm2(String s){ 
    int N=s.length(); 
    char[] a = new char[N]; 
    for(int i=0;i<N;i++){ 
     a[i]=s.charAt(i); 
     perm2(a,N); 
    } 
} 
private static void perm2(char[] a, int n){ 
    if(n==1){ 
     System.out.println(a); 
     return; 
    } 
    for(int i=0; i<n;i++){ 
     swap(a,i,n-1); 
     perm2(a,n-1); 
     swap(a,i,n-1); 
    } 
} 
private static void swap(char[] a, int i, int j) { 
    char c; 
    c=a[i]; 
    a[i]=a[j]; 
    a[j]=c; 
} 
    public static void main(String[] args) { 
int N=5; 
String alphabet="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
String elements = alphabet.substring(0,N); 
perm1(elements); 
System.out.println(); 
perm2(elements); 
    } 

} 

Antwort

0

den Code mit einem Debugger Stepping durch zeigt, dass Sie wegen dieses Abschnitts einen Stapelüberlauf Fehler:

for(int i=0; i<N; i++){ 
     perm1(prefix+s.charAt(i)+s.substring(0, i)+s.substring(i+1,N)); 
} 

perm1 wiederholt aufgerufen wird, aber die Eingabe nicht funktioniert ch Ange - es ist immer "abcde" ohne Präfix passiert, und das Ergebnis von prefix+s.charAt(i)+s.substring(0, i)+s.substring(i+1,N) ist immer noch "abcde". Da der Aufruf rekursiv ist und sich die Eingabe nicht mit jeder Iteration ändert, wiederholt er sich und nimmt immer mehr Speicherplatz auf dem Stapel ein, bis er überläuft und eine Ausnahme auslöst.