一、杨辉三角的概念与意义

1. 什么是杨辉三角?

杨辉三角是一个由数字排列成的三角形数阵,其特点是:

  • 每行的第一个数和最后一个数都是 1
  • 从第3行开始,中间的每个数等于它上方两数之和(即第 i 行第 j 列的数 = 第 i-1 行第 j-1 列的数 + 第 i-1 行第 j 列的数)。

2. 杨辉三角的意义

  • 数学上:揭示了二项式系数的规律(第 n 行对应 (a+b)^(n-1) 的展开式系数)。
  • 编程上:是理解二维数组动态规划基础思想的经典案例,适合练习嵌套循环和数组元素的关联计算。

二、杨辉三角的结构分析(以5行为例)

第1行:          1
第2行:        1   1
第3行:      1   2   1
第4行:    1   3   3   1
第5行:  1   4   6   4   1
  • 行数与列数:第 i 行有 i 个元素(行索引从1开始)。
  • 元素关系:以第4行为例,中间的 3 由第3行的 1+2 得到,另一个 3 由第3行的 2+1 得到。

三、解题思路(打印n行杨辉三角)

以打印 n=5 行杨辉三角为例,步骤如下:

  1. 创建二维数组
    定义 int[][] triangle,其中 triangle[i] 表示第 i+1 行(数组索引从0开始),第 i 行的长度为 i+1(如第0行长度1,第1行长度2)。

  2. 初始化边界值
    每行的第一个元素(j=0)和最后一个元素(j=i)都设为 1

  3. 填充中间元素
    对于第 i 行(i >= 2,即从第3行开始),中间元素 triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]

  4. 打印杨辉三角
    为美观,每行打印前先输出空格(行数越多,前面空格越少),再打印元素,元素间用空格分隔。

四、完整代码实现(打印n行杨辉三角)

import java.util.Scanner;public class YangHuiTriangle {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入杨辉三角的行数:");int n = scanner.nextInt();  // 输入行数,如5// 1. 创建二维数组,第i行有i+1个元素(i从0开始)int[][] triangle = new int[n][];for (int i = 0; i < n; i++) {triangle[i] = new int[i + 1];  // 第0行长度1,第1行长度2,...,第n-1行长度n}// 2. 填充杨辉三角for (int i = 0; i < n; i++) {// 2.1 每行首尾元素设为1triangle[i][0] = 1;          // 第一个元素triangle[i][i] = 1;          // 最后一个元素(索引=i)// 2.2 填充中间元素(从第2行开始,i >= 1时中间才有元素)for (int j = 1; j < i; j++) {  // j从1到i-1(避开首尾)triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];}}// 3. 打印杨辉三角(带格式化空格,居中显示)System.out.println("杨辉三角(" + n + "行):");for (int i = 0; i < n; i++) {// todo 如果等腰三角形不方便查看,可以将 打印空格的for循环注释掉// 3.1 打印每行前面的空格(总行数-n,每行递减)for (int k = 0; k < n - i - 1; k++) {System.out.print("  ");  // 两个空格,使三角形居中}// 3.2 打印当前行的元素for (int j = 0; j <= i; j++) {System.out.print(triangle[i][j] + "   ");  // 元素间用3个空格分隔}// 3.3 换行System.out.println();}}
}

五、代码执行流程与输出结果

输入行数 n=5 时:

  1. 数组初始化
    创建 5 行的二维数组,每行长度分别为 1,2,3,4,5

  2. 填充元素

    • 第0行(i=0):[1](首尾都是1,无中间元素)。
    • 第1行(i=1):[1, 1](首尾都是1,无中间元素)。
    • 第2行(i=2):[1, 1+1=2, 1][1,2,1]
    • 第3行(i=3):[1, 1+2=3, 2+1=3, 1][1,3,3,1]
    • 第4行(i=4):[1, 1+3=4, 3+3=6, 3+1=4, 1][1,4,6,4,1]
  3. 打印结果
    每行前的空格随行数增加而减少,元素间用空格分隔,形成等腰三角形。

输出结果:

请输入杨辉三角的行数:5
杨辉三角(5行):1   1   1   1   2   1   1   3   3   1   
1   4   6   4   1   

六、拓展:获取杨辉三角的指定行

若只需获取第 rowIndex 行(从0开始),可优化空间复杂度(无需存储整个三角):

public static int[] getRow(int rowIndex) {int[] row = new int[rowIndex + 1];row[0] = 1;  // 第一个元素为1for (int i = 1; i <= rowIndex; i++) {// 从后往前计算,避免覆盖上一行的值for (int j = i; j > 0; j--) {row[j] = row[j] + row[j - 1];}}return row;
}
  • 例如 rowIndex=3 时,返回 [1,3,3,1]

总结

杨辉三角的核心是利用上一行元素计算当前行元素,通过二维数组存储整个三角,或通过滚动数组优化空间。掌握其逻辑有助于理解:

  1. 二维数组的动态初始化(每行长度不同)。
  2. 元素间的依赖关系(中间元素 = 上方两元素之和)。
  3. 格式化输出的技巧(通过空格控制对齐)。

通过手动模拟前5行的计算过程,可直观理解每行元素的生成逻辑,加深对数组操作的掌握。