作为示例,我们正在梳理整数123456789
的排列。受Heap's algorithm的启发,我们拥有以下
public static ArrayList<String> comb(char[] seq, int n, ArrayList<String> box){
if(n == 1){
if (isSquare(Integer.valueOf(String.valueOf(seq)))) {
box.add(String.valueOf(seq));
}
} else {
for(int i=0; i<n; i++){
comb(seq,n-1, box);
int j;
if ((n%2)==0) {
j = i;
} else {
j = 0;
}
char temp = seq[n-1];
seq[n-1] = seq[j];
seq[j] = temp;
}
}
return box;
}
在当前情况下,我们感兴趣的是特定排列是否为整数的平方。由
实现public static boolean isSquare(int n) {
if ((n%10)==2 || (n%10) ==3 || (n%10)==7 || (n%10) == 8) {
return false;
} else if ( (Math.sqrt(n)) % 1 ==0) {
return true;
} else {
return false;
}
}
但是,要能够使用comb
,我必须在方法外部初始化一个空数组。我应该怎么做才能避免引起对全局变量的需求?我仍然想获得所有解决方案的box
。我意识到我的错误在于comb
的参数设置。
答案 0 :(得分:0)
创建一个“包装”原始递归函数的函数,为它提供所需的每个参数,并在必要时创建对象的副本:
假设您为了方便命名将comb(...)
函数重命名为combRecursive(...)
。
public static ArrayList<String> comb(char[] seq, int n){
char[] seqCopy = Arrays.copyOf(seq, seq.length);
return combRecursive(seqCopy, n, new ArrayList());
}