1

我有金字塔集的布局,我只是不知道如何组合或从数学上得到接下来的几个数字。我需要的是:

       1
     1 2 1
    1 3 3 1
   1 4 6 4 1
 1 5 10 10 5 1
1 6 15 20 15 6 1

我现在的代码是:

int x = 7;
for (int i =1; i<=x; i++) {
    for (int j =1; j<=x-i; j++) {
        System.out.print("  ");
    }
    for (int k=1; k<=i;k++) {
        System.out.printf("%2d",k);
    }
    for(int k=i-1; k>=1;k--) {
        System.out.printf("%2d",k);
    }
    System.out.println(" ");
}

但我的输出结果如下:

            1
          1 2 1
        1 2 3 2 1
      1 2 3 4 3 2 1
    1 2 3 4 5 4 3 2 1
  1 2 3 4 5 6 5 4 3 2 1
1 2 3 4 5 6 7 6 5 4 3 2 1

对不起,如果这很奇怪;这是我在这个网站上的第一个问题。如何修改我的代码以获得另一个金字塔?

4

1 回答 1

3

首先,我假设您正在尝试计算帕斯卡三角形,并且当您编写所需的输出时:

       1
     1 2 1
    1 3 3 1
   1 4 6 4 1
 1 5 10 10 5 1
1 6 15 20 15 6 1

你实际上的意思是:

       1
      1 1
     1 2 1
    1 3 3 1
   1 4 6 4 1
 1 5 10 10 5 1
1 6 15 20 15 6 1

因为否则它没有多大意义。

假设您犯了一个小错误并且第二个三角形是您想要的那个,那么这就是帕斯卡三角形。计算帕斯卡三角形的规则是将上面和左边的数字与上面和右边的数字相加,以找到新值。

帕斯卡三角

图片来源赫斯福尔德

您可以很容易地编写一个递归函数来执行此操作。使用递归函数,一个好方法是编写你的守卫和基本情况,然后递归。这看起来像:

private static int calculatePascalNumber(int row, int column)
{
    if (row < 1 || column < 1 || column > row) {
        return 0;
    } else if (column == 1 || row == column) {
        return 1;
    } else {
        return calculatePascalNumber(row - 1, column - 1) + 
                    calculatePascalNumber(row - 1, column);
    }
}

这些是此功能的规则

  • 如果行或列小于 1 或列比行宽,则这些点位于三角形之外,应返回 0
  • 如果该列位于结束列之一中(列等于 1 或行和列相等),则返回 1
  • 否则将上面的两个数字加到左边和右边

然后你可以在你的代码中调用这个函数,看起来像

int x = 7;
for (int row = 1; row <= x; row++) {

    for (int j =1; j<=x-row; j++) {
        if (j % 2 == 0) {
            System.out.print("  ");
        } else {
            System.out.print(" ");
        }
    }

    for (int column=1; column<=row;column++) {
        System.out.printf(" %2d", calculatePascalNumber(row, column));
    }

    System.out.println(" ");
}

我已经对格式进行了一些修改,如果您想进行进一步的工作,那么输出格式将是一件好事。

最后,值得注意的是性能。如果你想运行它来计算大三角形上的值,递归调用的数量将开始使这个函数运行得非常缓慢。解决此问题的一种可能方法是缓存对 calculatePascalNumber 的调用结果,这样当使用参数调用它时,它已经计算过它从 hashmap/ 数组中返回值,而不是多次运行所有计算。

另一个加快较大三角形速度的选项是使用此函数自行计算一行,这可能导致以下代码用于计算帕斯卡数字

private static int calculatePascalNumber(int row, int column)
{
    if (row < 0 || column < 0 || column > row) {
        return 0;
    } else if (column == 1) {
        return 1;
    } else {
        return (calculatePascalNumber(row, column - 1) 
                  * (row + 1 - column)) / (column - 1); 
    }
}

但是,您因效率而获得的东西,却因清晰而失去。

于 2014-11-10T10:28:59.363 回答