帕斯卡的三角递归

时间:2016-12-16 16:39:17

标签: java pascals-triangle

我需要编写一个打印pascal三角形的Java代码。这就是我到现在所做的。

import java.util.Scanner;

class Pascal {

    static int bnk (int n, int k) {

        if (k==0 || k==n) {
            return 1;
        } // B(n,k) Berechnung für Standardwert = 1;
        else {
            int x = (bnk(n-1, k-1) + bnk(n-1, k));
            return x;
        } // Berechnung aller sonstigen B(n,k)-Werte. 
    } // Berechnung von B(n,k)

    public static void main (String [] args) {

        Scanner sc = new Scanner(System.in);

        System.out.println("How many rows?: ");
        int r = sc.nextInt();

        sc.close();

        for (int n=0; n<r; n++) {

            for (int j=0; j<(r-n); j++) {
                System.out.print(" "); 
            } // Setzt Anzahl Leerzeichen vor erster Zahl

            for (int k=0; k<=n; k++) {

                int b = bnk(n,k);
                System.out.print(b+" ");
            } // Berechnet in jeder Reihe alle Elemente

            System.out.println();
        } // Berechnet Reihe nach Reihe
    } // main
} // class Pascal

第一种方法计算三角形中所需的值。 第二个通过打印(r-n)空白打印行的三角形。 n代表当前行,r代表行的总数。 因此,三角形的左侧以正确的方式打印,但问题是,当三角形中的值变得太高时,三角形在右侧变形。 我希望我所描述的是可以理解的。你能帮我找到一种正确格式化三角形的方法吗?

当前输出如下:

5行:https://gyazo.com/d9a536d3ac92c155707ebb2e4ee7745b

enter image description here

10行:https://gyazo.com/4ab0479f9324dd7c2911398ea5a71e33

enter image description here

2 个答案:

答案 0 :(得分:4)

因此您可以使用"\t"进行格式化,而不是使用1,然后使用2.然后您可以每1个空格或每2个空格分隔数字,允许第一个(顶部)空间位于第二个2,并重复。

答案 1 :(得分:2)

简单的解决方案:

计算要显示的最大位数,在案例3中为126.然后,使用此空间量显示每个数字,并使用前导或尾随空格填充它。

更复杂的解决方案,可能不会更好,具体取决于您的口味:

给出n行数字

  1. 初始化列表position_n,其存储将显示最后一行中的每个数字的位置。在您的示例中,最后一行是
  2. 1 9 36 84 126 126 84 36 9 1

    因此,positions_n将被设置为0,2,4,7,10,14,18,21,24,26(如果我没有错误)

    1. 向后迭代,通过取两个位置的平均值从positions_i生成position_i-1。对于position_n的例子,position_n-1因此(假设我们向上舍入):
    2. 1,3,6,12,16,20,23,25

      1. 显示这些位置的数字。
      2. 问题当然是我们在需要回合时会跳起来看起来很糟糕。此外,数字之间的间距可能会变得奇怪和不均匀。