递归置换函数没有在Java中返回正确的ArrayList

时间:2015-09-14 08:29:00

标签: java algorithm recursion

我正在尝试创建给定字符串数组的排列。

public static ArrayList<String[]> permutate(String[] str) {
    return permutate( str, 0, str.length -1, null );
}

public static ArrayList<String[]> permutate(String[] str, int curr, int stop, ArrayList<String[]> result) {
    if(result == null) {
        result = new ArrayList<String[]>();
    }
    if(curr == stop) {
        result.add(str);
        System.out.println(Arrays.toString(str));
        return result;
    }
    else {
        for(int j = curr; j <= stop ; j++) {
            //swap str[j] and str[curr]
            String tmp = str[j];
            str[j] = str[curr];
            str[curr] = tmp;

            permutate(str, curr+1, stop, result);

            //swap str[j] and str[curr]
            tmp = str[j];
            str[j] = str[curr];
            str[curr] = tmp;
        }           
        return result;
    }
}

在主要

    String[] str = {"A","B","C"};

    System.out.println("Inside the recursion:");
    result = permutate(str);
    System.out.println("Permutation result:");
    for(String[] arr: result){
        System.out.println(Arrays.toString(arr));
    }

这是在main中运行的输出。

Inside the recursion:
[A, B, C]
[A, C, B]
[B, A, C]
[B, C, A]
[C, B, A]
[C, A, B]
Permutation result:
[A, B, C]
[A, B, C]
[A, B, C]
[A, B, C]
[A, B, C]
[A, B, C]

奇怪的是,它在递归函数本身中打印了正确的排列。但是,它没有返回正确的ArrayList。

1 个答案:

答案 0 :(得分:2)

您总是修改同一个对象,将代码更改为

    if(curr == stop) {
        String[] dest = new String[str.length];
        System.arraycopy( str, 0, dest, 0, str.length );
        result.add(dest);

        System.out.println(Arrays.toString(str));
        return result;
    }

通过

    result.add(str);

您正在使用对同一对象的引用填充result对象。

事实上,如果你从这个

改变你的内心println
    System.out.println(Arrays.toString(str));

到这个

    for(String[] arr: result)
        System.out.println(Arrays.toString(arr));

你会得到这个输出

    [A, B, C]

    [A, C, B]
    [A, C, B]

    [B, A, C]
    [B, A, C]
    [B, A, C]

    [B, C, A]
    [B, C, A]
    [B, C, A]
    [B, C, A]

    [C, B, A]
    [C, B, A]
    [C, B, A]
    [C, B, A]
    [C, B, A]

    [C, A, B]
    [C, A, B]
    [C, A, B]
    [C, A, B]
    [C, A, B]
    [C, A, B]

显示,在每个循环中,您的result数组元素始终相同