有人可以解释这种图案打印方法中的递归逻辑吗?

Can someone explain the logic of recursion in this pattern printing method?

我正在尝试拼凑此示例中的逻辑。这是正常的代码。仅供参考,我有一位大学导师帮助我完成了这个例子,但他仍在试图弄清楚如何向我解释它。代码也搞定了,这只是为了我自己的递归知识。

public class Practice {

    public static void printTriangle(int n) { 

        if (n < 1) { 
            return; 
            
        } 
        else {
            
        printTriangle(n - 1); 
        printStars(n); 
        System.out.println();
        }
    } 
    public static void printStars(int n) {
        if (n > 0) {
        System.out.print("*");
        printStars(n-1);
        }
    }
    public static void main(String[] args) {
        printTriangle(5);
    }
}
 Output
*
**
***
****
*****

这是带有标记的测试代码,我用它来找出什么时候发生了什么。这有点碍眼,所以如果你认为你可以在不看这个烂摊子的情况下解释它,无论如何。

public class Practice {

    public static void printTriangle(int n) { 

        if (n < 1) { 
            System.out.println(n);
            
            return; 
            
        } 
        else {
        System.out.println("1");
        printTriangle(n - 1); 
        System.out.println(n);
        printStars(n);
        System.out.println("A");
        }
    } 
    public static void printStars(int n) {
        if (n > 0) {
        System.out.print(n);
        System.out.print("*");
        printStars(n-1);
        }
    }
    public static void main(String[] args) {
        printTriangle(5);
    }
}
1
1
1
1
1
0
1
1*A
2
2*1*A
3
3*2*1*A
4
4*3*2*1*A
5
5*4*3*2*1*A

直到打印出第一颗星,我才弄明白。我在 printTriangle 方法将它递减为 0 后打印了 n 的值,然后我在打印第一颗星之前打印了 n 的值,不知何故,它等于 1。我只是好奇 n 的值是多少增加。该值从 1 开始进入 printStars 方法,并且随着打印 stars

而不断增加

嗯,

printTriangle(5) 调用 printTriangle(4)
printTriangle(4) 调用 printTriangle(3)
printTriangle(3) 调用 printTriangle(2)
printTriangle(2) 调用 printTriangle(1) printTriangle(1) 调用 printTriangle(0)
printTriangle(0) 什么都不做,但是 returns 到 printTriangle(1)

printTriangle(1) 继续调用 printStars(1)
printStars(1) 打印一个星星并调用 printStars(0)
printStars(0) 什么也不做,returns 到 printStars(1)
printStars(1) 与 printTriangle(1)
无关,returns printTriangle(1) 打印换行符和 returns 到 printTriangle(2)

printTriangle(2) 继续调用 printStars(2)
printStars(2) 打印一个星星并调用 printStars(1)
printStars(1) 打印一个星星并调用 printStars(0)
printStars(0) 什么也不做,returns 到 printStars(1)
printStars(1) 与 printStars(2)
无事可做 returns printStars(2) 与 printTriangle(2)
无关,returns printTriangle(2) 打印换行符和 returns 到 printTriangle(3)

...

我希望通过提供书面和视觉解释来回答您的问题:

书面:

首先我们从 printTriangle(5) 开始。由于 n < 1 为假,我们继续执行 printTriangle(4)。这个过程一直持续到我们到达 printTriangle(0)。由于 printTriangle(0) 不会输出任何内容(因为 0 < 1 为真),我们从 printTriangle(1):

开始

我们从 printTriangle(1)printStars(1)。我们只能从这里打印一颗星。在我们这样做之后,我们打印一个换行符。接下来,我们有 printTriangle(2),它引导我们进入 printStars(2)。这给了 1 星,但导致 printStars(1) 给了我们第二颗星和换行符。这个过程一直持续到我们达到 5 星。

视觉表示:

我希望这有助于回答您的问题!如果您需要进一步的说明或详细信息,请告诉我:)