Pascal三角形递归

3

我需要编写一个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


也许你可以在问题中添加你当前的输出(以说明)。 - user180100
我试着添加输出,但是它不允许我正确地编辑成为原作者的答案。无论如何,你遇到的问题是在三角形中没有给多位数字留出空间。你应该在数字之间放更多空格,我猜它会开始看起来更好。 - DejaVuSansMono
2个回答

4

所以您可以使用"\t"进行格式化,但不是使用1,而是使用2。然后您就可以将数字每1个空格或每2个空格分开,从而使第一个(顶部)位于第二个2之间,并且重复。


你能否简单地写一段代码来展示你的意思?我对Java还是很新手,不太明白你想要做什么。 - Tim Buchholz
@TimBuchholz 的意思是,不要使用 System.out.print(" "); 来打印空格,而应该使用 System.out.print("\t"); 或者 System.out.print("\t\t");,其中 "\t" 是制表符的转义字符。 - Frakcool
我尝试过了,它并不像你想象的那样工作。它会生成一个直角三角形,而不是他要找的帕斯卡三角形。很酷,但这并没有解决问题。 - DejaVuSansMono

2

简单的解决方案:

计算要显示的数字中最大的数字,对于您的情况是126中的3。然后,使用这个数量的空间显示每个数字,并添加前导或尾随空格以填满它。

更复杂的解决方案,取决于个人口味,可能并不更好:

给出n行要显示的数字

  1. 初始化一个名为positions_n的列表,其中存储最后一行中每个数字要显示的位置。在您的示例中,最后一行是

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生成positions_i-1。对于positions_n的示例,positions_n-1因此将是(假设我们四舍五入):

1、3、6、12、16、20、23、25

  1. 在这些位置显示数字。

问题当然在于每次需要四舍五入时会出现跳跃,可能看起来很糟糕。另外,数字之间的间距可能变得奇怪和不均匀。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接