置换代码不适用于Java

置换代码不适用于Java,java,Java,我的老师给了我一些java代码,让我用python重写。我不是在请求重写它的帮助,但是当我将代码输入Java编译器时,我遇到了以下错误: Exception in thread "main" java.lang.StackOverflowError at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:449) at java.lang.StringBuilder.append(StringBuilde

我的老师给了我一些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) 
线程“main”java.lang.StackOverflower中出现异常 在 append(AbstractStringBuilder.java:449) 在java.lang.StringBuilder.append(StringBuilder.java:136) 位于java.lang.StringBuilder。(StringBuilder.java:113) 在Permutations.perm1(Permutations.java:12) 在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);
    }

}
公共类置换{
公共静态void perm1(字符串s){
perm1(“,s);
}
私有静态void perm1(字符串前缀,字符串s){
int N=s.长度();
如果(N==0){
System.out.println(前缀);
}否则{

对于(int i=0;i,使用调试器单步执行代码会显示由于以下部分而导致堆栈溢出错误:

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

for(int i=0;i此行有错误:

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));
遵守本守则: