Java 循环的递归不增加它';返回语句前的s值 公共类Main2{ 私有静态int[]arr=新int[3]; 私有静态int[]值=新int[]{1,2,3,4}; 公共静态void main(字符串[]args){ 代际差异(0); } 私有静态无效生成差异(整数索引){ 如果(索引==arr.length){ System.out.println(Arrays.toString(arr)); 返回; } for(int i=索引;i

Java 循环的递归不增加它';返回语句前的s值 公共类Main2{ 私有静态int[]arr=新int[3]; 私有静态int[]值=新int[]{1,2,3,4}; 公共静态void main(字符串[]args){ 代际差异(0); } 私有静态无效生成差异(整数索引){ 如果(索引==arr.length){ System.out.println(Arrays.toString(arr)); 返回; } for(int i=索引;i,java,recursion,Java,Recursion,因此在这段代码中,generateVariations方法中的for循环不会增加i的值,直到我的代码执行命中return语句。为什么会这样?我的意思是I具有index的值,就好像I++不存在一样,它只会在命中return语句后自我增加。想想看,I++只会在for循环体完成后执行。但是,您正在递归地调用generateVariations,即在完成body的第一个函数之前,再次调用generateVariations。。。再一次。。。一次又一次。当然,generateVariations的每次调用

因此在这段代码中,
generateVariations
方法中的for循环不会增加
i
的值,直到我的代码执行命中
return
语句。为什么会这样?我的意思是
I
具有
index
的值,就好像
I++
不存在一样,它只会在命中
return
语句后自我增加。

想想看,
I++
只会在for循环体完成后执行。但是,您正在递归地调用
generateVariations
,即在完成body的第一个函数之前,再次调用
generateVariations
。。。再一次。。。一次又一次。当然,
generateVariations
的每次调用都会得到一个越来越大的
索引(因为您在调用中增加了),因为这样的执行最终会命中return语句。一旦发生这种情况,最内部的for体(可能是深入到
generateVariations
的4个调用)将完成,并最终增加
i
值,以此类推。

想想看,
i++
仅在for循环体完成后才会执行。但是,您正在递归地调用
generateVariations
,即在完成body的第一个函数之前,再次调用
generateVariations
。。。再一次。。。一次又一次。当然,
generateVariations
的每次调用都会得到一个越来越大的
索引(因为您在调用中增加了),因为这样的执行最终会命中return语句。一旦发生这种情况,身体最里面的部分(也许你是深入到
generateVariations
的4个调用)将完成并最终增加它的
i
值,以此类推。

为什么你认为它没有增加?对我来说,似乎一切都必须很好地工作,因为我“偷”了这个例子,我自己无法理解。。。调试并没有帮助,这就是我为什么问的原因,但迈克尔向我解释了。为什么你认为它没有增加?对我来说,似乎一切都必须很好地工作,因为我“偷”了这个例子,我自己无法理解。。。调试也没用这就是我为什么问的原因,但Michael向我解释了。谢谢,我明白了,但我似乎还有一个问题。递归调用中的
return
语句,它所做的只是从调用堆栈中删除第一个方法
return
调用将弹出最内部的函数调用。然后调用最里面的函数的for体将继续运行。谢谢,我明白了,但我似乎还有一个问题。递归调用中的
return
语句,它所做的只是从调用堆栈中删除第一个方法
return
调用将弹出最内部的函数调用。然后,调用最内部函数的函数体的for将继续操作。
public class Main2 {
    private static int[] arr = new int[3];
    private static int[] values = new int[]{1, 2, 3, 4};

    public static void main(String[] args) {
        generateVariations(0);
    }

    private static void generateVariations(int index) {
        if (index == arr.length) {
            System.out.println(Arrays.toString(arr));
            return;
        }
        for (int i = index; i < values.length; i++) {
            arr[index] = values[i];
            swap(i, index);
            generateVariations(index + 1);
            swap(i, index);
        }

    }

    private static void swap(int i, int index) {
        int temp = values[i];
        values[i] = values[index];
        values[index] = temp;
    }
}