数字金字塔,初学者递归跟踪难度?

时间:2014-11-15 13:07:35

标签: java recursion

我是JAVA的初学者,我在跟踪递归和完全理解它时遇到了一些困难,所以在这里我有一个程序的代码,如果我们写3,它将输出:

1
12个
123个
12个
1

或者,如果我们写5,它将输出

1
12个
123个
1234
12345个
1234
123个
12个
1

public class Aufgabe3 {

    private static void printSequenz(int n) {
        if(n<1) {
            return;
        }   
        printLoToHi(n-1);
        printMany(n);
        printHiToLo(n-1);
    }

    private static void printHiToLo(int n){
        if(n<1){
            return;
        }
        printMany(n);
        printHiToLo(n-1);
    }

    private static void printLoToHi(int n){
        if(n<1){
            return;
        }
        printLoToHi(n-1);
        printMany(n);
    }

    private static void printMany(int n){
        for(int i=1;i<=n;i++){
            System.out.print(i);
        }
        System.out.println();
    }

    public static void main(String[] args) {
        printSequenz(5);
    }
}

现在这是我不明白的地方。例如,在方法printHiToLo中,它调用方法printMany(n),然后它调用自己为n-1,并重复直到n大于0.但我不明白printLoToHi方法是如何工作的?它是如何到达printMany方法的?如果它只是调用自己,直到n大于0.这对我来说真的很困惑...感谢有人帮助我:)

2 个答案:

答案 0 :(得分:1)

private static void printLoToHi(int n){
        if(n<1){          // This is the base case that terminates the recursion.
            return;       // You'll always have one - sometimes more.
        }
        printLoToHi(n-1); // This is where the recursion takes place.
        printMany(n);     // But when n < 1 it returns to here and continues on.
}

所以你看到它确实被调用了;仅在达到基本情况(n <1)之后。

一个简单的例子就是如果你用printLoToHi(1) ...

来调用它
  1. 它将通过if条件。
  2. 它以n - 1(0)作为参数调用自身。
  3. 这次它失败并返回。
  4. n == 1我们原来的方法。
  5. printMany(1)被召唤。

答案 1 :(得分:-1)

看,你的功能是逐行执行的。因此,在printLoToHi中执行递归调用,然后调用printMany

例如,如何工作printLoToHi(3): 它检查3是否小于1.然后调用printLoToHi(2)。 它检查2是否小于1.然后调用printLoToHi(1)。 它检查1是否小于1.然后调用printLoToHi(0)。 它检查0是否小于1.它是,所以它返回。 然后调用printMany(1)。 然后调用printMany(2)。 然后调用printMany(3)

您可以将递归调用视为单个函数,该函数执行某些操作但不考虑它是如何工作的。你可以假设它工作并编写函数的其他部分。如果该部分是正确的 - 递归是正确的。