没有全局变量的递归方法的参数化

时间:2018-10-09 18:04:50

标签: java recursion global-variables

作为示例,我们正在梳理整数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的参数设置。

1 个答案:

答案 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());
}