首页 > 解决方案 > 使用递归的引脚金字塔

问题描述

在此处输入图像描述我想使用递归(无循环)打印一个引脚金字塔。我的代码几乎完成了,但我的金字塔是颠倒的,而且没有格式化。我该如何解决。下面是我的源代码:

public void pinPattern(int count) {
        if(count == 1)
            System.out.println("*");
        else {
            System.out.print("*");
            pinPattern(count - 1);
        }
    }

    public int numberOfPins(int n) {
        if(n == 0)
            return 0;
        else {
            pinPattern(n);
            return n + numberOfPins(n - 1);
        }
    }

    public static void main(String[] args) {
        Recursion x = new Recursion();
        System.out.println("The number of pin: " + x.numberOfPins(5));
    }

提前致谢。

标签: java

解决方案


所以这里有两个考虑。首先,需要让金字塔走向另一个方向。如果它是颠倒打印的,那么不要倒计时(从最大值到最小值),而是反转方法。就像是:

public static int pinPatternUp(int numPins, int maxPins)
{
    if (numPins <= maxPins) {
        // this will add spaces
        spaces(maxPins - numPins);
        pins(numPins);
        return numPins + (pinPattern(numPins + 1, maxPins));
    }
    return 0;
}

pins方法的逻辑(在 OP 的代码中是 'pinPattern ) in the OP's approach is essentially fine for either direction. However, making this change (so that there is a space after each*`)将允许更好的格式化。

System.out.print("* ");

第二个问题是格式问题。在这种情况下,我们可以将金字塔视为在第一个输出之前需要N个空格。通过一些调查,似乎给定的行将具有总行数 - 就空格而言的当前行。使用递归,可以执行以下操作:

public static void spaces(int num)
{
    if (num == 0) {
        return;
    }
    System.out.print(" ");
    spaces(num - 1);
}

请注意,现在可以有一个“向上”或“向下”的金字塔,具体取决于pinPattern是增加还是减少。

注意:由于一些编辑,方法名称与 OP 不完全一致。

public static void main(String[] args)
{
    pinPatternUp(1, 5);
    pinPatternDown(5, 5);
}

运行向上然后向下运行时的输出:

    *
   * *
  * * *
 * * * *
* * * * *
* * * * *
 * * * *
  * * *
   * *
    *

推荐阅读