为什么递归循环中的局部变量被忽略? For循环中的Java递归循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么递归循环中的局部变量被忽略? For循环中的Java递归循环相关的知识,希望对你有一定的参考价值。

我正在编写一个程序,该程序使用数字n,并返回所有可能的组合以将组分成几对。

为此,我使用一种递归方法,该方法以编号为1到n的ArrayList开头。然后,我选择第一个数字,然后将其与另一个数字匹配,将两者都删除。我使用For循环将第一个数字与其他每个数字配对,然后在最后调用该方法。因此,除了n-2之外,它将执行相同的过程,因为我删除了配对的数字(存储它们以免丢失)。

我发现这最初是可行的,但是当它第一次到达基本情况时,当我的程序从方法调用堆栈向下移至其他递归调用时,存储数字ArrayList的局部变量将保持在空列表中。

我指的是ArrayList,称为“数字”。递归方法为createPair。我在下面附加了我的代码:

    public static void Combinations(int n){
    //store possible numbers that can be chosen
    ArrayList<Integer> numbers = new ArrayList<>(n);

    //store combinations and pairs
    ArrayList<int[]> pairs = new ArrayList<>();

    //returns it in the proper form
    //int[] value = new int[n];

    //reset number
    for(int i = 1; i <= n; i++){
        numbers.add(i);
    }

    //do combinations
    //n-1, n-3, ... 1 (increments of two)
    createPair(pairs, numbers, n);
}

public static void createPair(ArrayList<int[]> pairs, ArrayList<Integer> numbers, int n){
    int length = numbers.size();

    //base case
    if(length == 0){
        int[] value = convertPair(pairs, n);
        List1.add(value);
        return;
    }

    int[] pair = new int[2];
    pair[0] = numbers.get(0);
    numbers.remove(0);
    for(int i = 0; i < length; i++){
        pair[1] = numbers.get(i);
        ArrayList<Integer> numbers1 = numbers;
        numbers1.remove(i);
        pairs.add(pair);
        createPair(pairs, numbers1, n);
    }
}

//convert to one array value form
public static int[] convertPair(ArrayList<int[]> pairs, int n){
    int[] value = new int[n];
    for(int i = 0; i < n/2; i++){
        int index = pairs.get(i)[1]-1;
        int index2 = pairs.get(i)[0]-1;

        value[index] = pairs.get(i)[1];
        value[index2] = pairs.get(i)[0];
    }
    return value;
}
答案

方法参数通过引用传递,因此您在所有情况下都可以简单地编辑相同的数组。另外,在以下任务中:

ArrayList<Integer> numbers1 = numbers;

您不是在复制数组,只是创建对同一数组的另一个引用。如果要确保您正在使用其他数组,则可以使用Arrays.copyOf()之类的东西来创建新对象。

以上是关于为什么递归循环中的局部变量被忽略? For循环中的Java递归循环的主要内容,如果未能解决你的问题,请参考以下文章

forin循环的变量如何变为全局

JAVA,关于for循环,循环体里的问题

为啥'continue'语句忽略'while'循环中的循环计数器增量,而不是'for'循环?

为啥将局部变量推回 Vectorworks

C#中,定义了一个枚举,怎么用for循环来遍历枚举中的每个值?

由于 continue 而忽略了数组 for 循环中的基本 else 语句