为什么这个递归代码像这样工作?

时间:2014-11-26 17:17:31

标签: java recursion

我已经集思广益了2个小时,我处于疯狂的边缘。这是代码:

import java.util.Scanner;
public class RecursiveNestedLoops {
    public static int numberOfLoops;
    public static int numberOfIterations;
    public static int[] loops;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("N = ");
        numberOfLoops = input.nextInt();
        System.out.print("K = ");
        numberOfIterations = input.nextInt();
        input.close();
        loops = new int[numberOfLoops];
        nestedLoops(0);
    }

    public static void nestedLoops(int currentLoop) {
        if (currentLoop == numberOfLoops) {
            printLoops();
            return;
        }

        for (int counter=1;counter<=numberOfIterations;counter++) {
            loops[currentLoop] = counter;
            nestedLoops(currentLoop + 1);
        }
    }

    public static void printLoops() {
        for (int i = 0; i < numberOfLoops; i++) {
            System.out.printf("%d ", loops[i]);
        }
        System.out.println();
    }
}

现在我不知道它是如何运作的,但是它应该如此运作。经过2个小时的思考后,我得出的结论是,我可能无法理解这些方法的作用:

printLoops(); 
return;

printLoops(); - 这称为打印方法是的。

返回; - 这不应该结束整个nested nestedLoops方法,只是结束程序?相反,它的作用是以某种方式重新启动方法,并开始执行for循环的其余部分。

2 个答案:

答案 0 :(得分:1)

  

返回; - 这不应该结束整个nested nestedLoops方法,只是结束程序吗?

它会将当前通话结束到nestedLoops。但是nestedLoops是递归的 - 它自己调用 - 并且结束当前调用将不会终止所有调用代码。

考虑这个简单的非递归示例:

public void foo() {
    System.out.println("foo");
    return;
}

public void foobar() {
    foo();
    System.out.println("bar");
}

foobar()会同时打印foobar,因为来自return的来电中的foo()不会终止对bar()的调用

使用递归,它是相同的,除了两个调用是相同的方法。终止一个呼叫nestedLoops不会终止另一个呼叫。

答案 1 :(得分:0)

当它currentLoop == numberOfLoops停止时,return。您的第一次调用currentLoop为0.然后1.当currentLoopnumberOfLoops时,它会停止。我相信你的问题在循环中递归,我想你想要

public static void nestedLoops(int currentLoop) {
    // System.out.printf("%d of %d%n", currentLoop, numberOfLoops);
    if (currentLoop == numberOfLoops) {
        printLoops();
        return;
    }
    for (int counter = 1; counter <= numberOfIterations; counter++) {
        loops[currentLoop] = counter;
    }
    nestedLoops(currentLoop + 1); // <-- HERE
}