迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java 中的帕斯卡三角形

作者:迹忆客 最近更新:2023/09/28 浏览次数:

今天,我们将学习 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)。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

检查是否安装了 Java

发布时间:2023/09/29 浏览次数:186 分类:Java

本文按照步骤检查 Java 是否安装在不同的操作系统中。本文教我们检查机器上是否安装了 Java。一些软件和应用程序需要 Java,要检查我们的设备是否支持它,我们需要按照以下步骤操作。

检查 Java 版本

发布时间:2023/09/29 浏览次数:194 分类:Java

本文介绍了检查已安装 Java 版本的方法。Java 是一种用于创建软件应用程序的编程语言。要检查本地系统中安装的 Java 版本,你可以使用一些将结果显示到控制台的命令。

检查 Linux 中的 Java 版本

发布时间:2023/09/29 浏览次数:150 分类:Java

本文讨论了在 Linux 机器上检查 Java 版本的方法。要在 Linux 中检查 Java 版本,我们可以使用 version 命令、whereis 命令和文件路径。

在 Mac 中检查 Java 版本

发布时间:2023/09/29 浏览次数:180 分类:Java

Java 平台是一种安全的开发语言环境,使你能够在各种计算平台上快速构建和部署应用程序。它提供了一个不依赖底层操作系统的安全运行时环境,同时提供与本地方法和传统编程语言的

在 Java 中转义 HTML

发布时间:2023/09/29 浏览次数:153 分类:Java

本文解释了如何在 Java 中转义 HTML 字符和符号。为此,我们可以使用 Apache commons-text 和 StringEscapeUtils.escapeHtml4(str) 方法来转义 Java 中的 HTML 符号和字符。

Java 中的无穷大数

发布时间:2023/09/29 浏览次数:62 分类:Java

文章介绍了在 Java 中实现无穷大的方法。本文讨论了在 Java 中实现无穷大的方法。有几个数学场景可能需要实现无穷大的数学运算。

Java 中的幂运算

发布时间:2023/09/29 浏览次数:198 分类:Java

本篇文章主要讲的是在 Java 中如何进行幂运算。本文介绍了如何在 Java 中进行幂操作,并列举了一些示例代码来理解这个话题。

在 Java 中生成指定范围内的随机数

发布时间:2023/09/29 浏览次数:121 分类:Java

这篇文章介绍了如何在 Java 中生成指定范围内的随机数。本文介绍了如何在 Java 中生成指定范围内的随机数。有几种在 Java 中生成随机数的方法,例如 ThreadLocalRandom 类的 nextInt() 方法,Math 类的

Java 中的递归斐波那契数列

发布时间:2023/09/29 浏览次数:85 分类:Java

本文介绍了在 Java 中创建递归斐波那契序列的方法。由从 0 和 1 开始的最后两个数字相加形成的序列。如果要查找第 n 个元素,则可以通过(n-1)和(n-2)项相加来找到该数字,其中 n 必须大于 0。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便