Java 中的帕斯卡三角形

Mehvish Ashiq 2024年2月15日
  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
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