java - 为什么递归循环中的局部变量会被覆盖? Java For 循环内的递归循环

标签 java recursion combinations

我正在编写一个程序,它接受数字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;
}

此外,我在运行时收到的错误消息(对于n = 8)是

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    at java.util.ArrayList.get(ArrayList.java:433)
    at wormhole.createPair(wormhole.java:294)
    at wormhole.createPair(wormhole.java:300)
    at wormhole.createPair(wormhole.java:300)
    at wormhole.createPair(wormhole.java:300)
    at wormhole.Combinations(wormhole.java:277)
    at wormhole.main(wormhole.java:169)`

最佳答案

再次查看我的代码后,我找到了问题所在。我从 numbers ArrayList 中删除数字,因此当下一个递归调用运行时,ArrayList 已经是空的。为了解决这个问题,我创建了一个临时变量。

关于java - 为什么递归循环中的局部变量会被覆盖? Java For 循环内的递归循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59278473/

相关文章:

java - 使用php和java进行密码加密

java - 这需要 JAR 文件吗?

java - 740 : The requested operation requires elevation in java

c - 递归函数中返回的局部变量

ruby - Python itertools 的 Ruby 等价物是什么,尤其是。组合/排列/groupby?

r:使用所有可能的选项和变量组合数量创建数据框

java - 编写java注解用于计时方法调用

java - ArrayList 上的递归二分查找

c++ - 使用堆栈而不是递归实现 Lisp eval

python - 求和 : Is recursion necessary, 以及递归算法是什么样的?