我的老师给了我一些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);
}
}
答案 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