Java 中的帕斯卡三角形

Mehvish Ashiq 2023年1月30日 2022年4月27日
  1. 帕斯卡三角形
  2. 用 Java 编写帕斯卡三角形程序的方法
Java 中的帕斯卡三角形

今天,我们将学习 Java Pascal 的三角形。我们将学习三种方法:组合方法、数组和不使用数组,并了解这些方法的时间和空间复杂度。

帕斯卡三角形

它是二项式系数三角阵列。它是一个数字三角形,其中每个数字都是直接位于其上方的两个数字的总和,不包括全为 1 的边。

例如,1+1 = 21+3 = 4,如下所示:

java 帕斯卡三角 - 帕斯卡三角

用 Java 编写帕斯卡三角形程序的方法

在这里,我们将学习使用 Java 编程打印帕斯卡三角形的三种方法。

  • 使用组合(组合是一个统计概念)用于 Java 帕斯卡的三角形
  • 使用数组打印帕斯卡三角形
  • 不使用数组打印帕斯卡三角形

让我们更深入地研究上面列出的每种方法。

在 Java 中使用组合打印帕斯卡三角形

示例代码:

//pascalTriangle class
public class pascalTriangle {

    /*
    n number of lines of Pascal's triangle
    */
    static void printPascalTriangle(int n){

        for(int line = 0; line < n; line++){
            for(int k = 1; k < n-line; k++)
                System.out.print(" ");
            for(int j = 0; j <= line; j++)
                System.out.print(nCr(line,j) + " ");
            System.out.println();
        }
    }

    //calculates each entry of every line in Pascal's triangle
    static int nCr(int n, int r){

        int numerator = 1, denominator = 1;
        if(n < r || n == 0)
            return 1;

        for(int i = r; i >= 1; i--){
            numerator = numerator * n--;
            denominator = denominator * i;
        }
        return (numerator/denominator);
    }

    //main method
    public static void main(String args[]){
        int numberOfLines = 5;
        printPascalTriangle(numberOfLines);
    }
}

输出:

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1

我们使用组合使用 Java 编程打印帕斯卡三角形。在 main 方法中,我们获取 numberOfLines 并将其传递给 printPascalTriangle() 方法以打印三角形。

printPascalTriangle() 方法进一步调用 nCr() 方法来计算每一行中的每个条目。每个行号等于条目数。

例如,第 1 行有一个条目 1,第 2 行有两个条目 1 1,第 3 行有三个条目 1 2 1

在这里,每个条目都是在 nCr() 方法中使用以下公式计算的:

nCr = n! / (r! * (n-r)!)

这里,nCr 是组合的数量,n 是集合中对象的总数,r 是从集合中选择对象的数量。以下是每个条目的计算的可视化演示:

java 帕斯卡三角 - 入口计算

通过使用这种方法,时间复杂度将为 O(n3),因为我们为两个循环中的每个条目调用 nCr() 函数。请记住,nCr() 本身使用 for 循环来计算每一行的每个条目,方法是使用 nCr = n! / (r! * (n-r)!) 公式。

我们可以降低这个时间复杂度吗?是的。我们可以使用二维数组来做到这一点,其解决方案如下所示。

在 Java 中使用数组打印帕斯卡三角形

如果我们专注于每个条目,我们可以在前一行的正上方看到两个数字的总和。三角形外的所有数字都是零。

例如,第一行是 0 1 0,其中 1 是帕斯卡三角形的一部分,而 0s 是不可见的。我们也可以说帕斯卡三角形的每一行都夹在两个零之间。

请看以下演示:

java pascal 的三角形 - 每个条目是前两个数字的总和

这让我们考虑使用二维数组来计算、存储和打印帕斯卡三角形的值。

示例代码:

public class pascalTriangle {

    //calculate all entries of Pascal's triangle
    static int[][] calPascalTriangleEntries(int n){
        //create 2D array of n size
        int ncrArray[][] = new int[n][n];

        //the first entry will always be 1
        ncrArray[0][0] = 1;

        //starting from the second row
        for(int i=1; i<n; i++){
            //the first entry of each row is always 1
            ncrArray[i][0] = 1;
            for(int j=1; j<=i; j++)
                ncrArray[i][j] = ncrArray[i-1][j-1] + ncrArray[i-1][j];
        }
        return ncrArray;
    }

    //print pascal's triangle
    static void printPascalTriangle(int pascalEntries[][], int n){
        //prints lines
        for(int i=0; i<n; i++){
            //print spaces
            for(int k=0; k<n-i; k++)
                System.out.print(" ");
            //prints entries
            for(int j=0; j<=i; j++)
                System.out.print(pascalEntries[i][j]+" ");
            System.out.println();
        }
    }

    //main method
    public static void main(String[] args) {
        int n = 5; //number of lines
        int pascalEntries[][] = calPascalTriangleEntries(n);
        printPascalTriangle(pascalEntries, n);

    }
}

输出:

     1
    1 1
   1 2 1
  1 3 3 1
 1 4 6 4 1

在这里,main 方法获取行数并将其保存在 n 变量中,该变量传递给 calPascalTriangleEntries() 方法以计算帕斯卡三角形的每一行的条目。它返回一个包含所有条目的数组,我们将其保存在 pascalEntries 中。

此外,我们将 pascalEntriesn 传递给 printPascalTriangle() 方法以将它们打印成三角形。请参阅上面给出的输出。

这里,时间复杂度为 O(n2)。空间复杂度为 O(n),因为我们使用了一个额外的数组。

我们可以使用以下不使用数组的解决方案来最小化空间复杂度。

在 Java 中不使用数组打印 Pascal 的三角形

示例代码:

public class pascalTriangle {
    public static void main(String[] args) {
        int n = 5;
        int pascalEntry = 1;

        for(int line=0; line<n; line++){
            //Output the blank space
            for(int k=0; k<n-line; k++)
                System.out.print(" ");

            for(int column=0; column<=line; column++){
                if(column==0 || line==column)
                    pascalEntry = 1;
                else
                    pascalEntry = pascalEntry * (line-column + 1)/column;
                System.out.print(pascalEntry+" ");
            }
            System.out.println();
        }
    }
}

输出:

     1
    1 1
   1 2 1
  1 3 3 1
 1 4 6 4 1

这个 main 方法使用以下公式来计算帕斯卡三角形中每一行的每个条目:

pascalEntry = pascalEntry * (line - column + 1) / column

这个解决方案很简单。我们只需要处理嵌套 for 循环中每个 pascalEntry 的行(单独的行)和列索引。

这里,空间复杂度为 O(1),时间复杂度为 O(n2)。

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

相关文章 - Java Math