排列代码不工作Java

时间:2017-05-16 14:43:17

标签: java

我的老师给了我一些java代码,并让我在python中重写它。我没有要求帮助重写它,但当我将代码输入我的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) 

非常感谢任何帮助,以下是代码:

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);
    }

}

2 个答案:

答案 0 :(得分:0)

使用调试器逐步执行代码表明由于以下原因而出现堆栈溢出错误:

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

perm1,但输入没有变化 - 它始终通过"abcde"而没有前缀,prefix+s.charAt(i)+s.substring(0, i)+s.substring(i+1,N)的结果仍然是{ {1}}。由于调用是递归的,并且输入不会随着每次迭代而改变,它只是重复并在堆栈上占用越来越多的空间,直到它溢出并抛出异常。

答案 1 :(得分:0)

此行中有错误:

perm1(prefix+s.charAt(i)+s.substring(0, i)+s.substring(i+1, 
N));

应该是这样的:

perm1(prefix + s.charAt(i), s.substring(0, i) + s.substring(i + 1, N));

遵守此代码: http://introcs.cs.princeton.edu/java/23recursion/Permutations.java.html