java - 我需要帮助使用某种算法生成金字塔来组合数字(嵌套循环)

标签 java loops for-loop nested-loops pascals-triangle

我有金字塔组的布局,但我不知道如何组合或用数学方法得到接下来的几个数字。我需要的是:

       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

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

最佳答案

首先,我假设您正在尝试计算 Pascal triangle并且当您写道所需的输出是:

       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

否则它没有多大意义。

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

Pascal Triangle

Image credit Hersfold

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

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 /数组中的值,而不是多次运行所有计算。

另一个加速较大三角形的选项是使用 this function用于自行计算一行,这可能导致以下 calculatePascalNumber 代码

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); 
    }
}

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

关于java - 我需要帮助使用某种算法生成金字塔来组合数字(嵌套循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808858/

相关文章:

java - 替换 Android/Java 中第一次出现的字符?

java - 导致空字段的 Jena TDB 插入语句

javascript - 如何循环遍历数组及其内部对象

json - AngularJS - 嵌套 forEach 来迭代 Json

r - 使用 R 进行网页抓取和循环浏览页面

json - 遍历嵌套的 JSON 对象并使用 Python 获取值

java - Spring Security 拦截 url 究竟是如何工作的?

Java Maven exec-maven-plugin 带有限定名称的 ClassNotFoundException

python - 列表的循环值

java - 我正在尝试使用一种方法来查找数组中哪些数字大于 20 并返回一个百分比