輸出範例(5 行):
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
public class PrintYangHui {
public static void main(String[] args) {
printMethod1(5);
System.out.println("--- 分隔線 ---");
printMethod2(5);
}
/**
* 方法一:手動賦值前兩行,後續按規則計算
* 使用二維陣列模擬三角形結構,列寬 = 2*行數+1
*/
public static void printMethod1(int line) {
int[][] triangle = new int[line][2 * line + 1];
for (int i = 0; i < line; i++) {
for (int j = 0; j < 2 * line + 1; j++) {
if (i == 0) { // 第 1 行
triangle[i][j] = (j == line) ? 1 : 0;
} else if (i == 1) { // 第 2 行:手動設定 1 2 1
if (j == line) triangle[i][j] = 2;
else if (j == line - 2 || j == line + 2) triangle[i][j] = 1;
else triangle[i][j] = 0;
} else { // 第 3 行及以後
if (j == 0) triangle[i][j] = triangle[i - 1][j + 1];
else if (j == 2 * line) triangle[i][j] = triangle[i - 1][j - 1];
else triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j + 1];
}
// 輸出:0 顯示為空格
System.out.print(triangle[i][j] == 0 ? " " : triangle[i][j]);
}
System.out.println();
}
}
/**
* 方法二:僅賦值第 1 行,其餘完全按規則遞推
* 更符合數學定義,代碼更簡潔
*/
public static void printMethod2(int line) {
int[][] triangle = new int[line][2 * line + 1];
for (int i = 0; i < line; i++) {
for (int j = 0; j < 2 * line + 1; j++) {
if (i == 0) { // 僅第 1 行賦值
triangle[i][j] = (j == line) ? 1 : 0;
} else {
if (j == 0) triangle[i][j] = triangle[i - 1][j + 1];
else if (j == 2 * line) triangle[i][j] = triangle[i - 1][j - 1];
else triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j + 1];
}
System.out.print(triangle[i][j] == 0 ? " " : triangle[i][j]);
}
System.out.println();
}
}
}
| 維度 | 方法一 | 方法二 |
|---|---|---|
| 初始化行數 | 前兩行手動設定 | 僅第一行設定 |
| 邏輯複雜度 | 較高(含特判) | 低(純遞推) |
| 輸出結果 | 完全一致 | 完全一致 |
| 推薦程度 | 教學演示 | 生產/面試首選 |
public static void printPretty(int rows) {
List> triangle = new ArrayList<>();
// 1. 產生數值
for (int i = 0; i < rows; i++) {
List row = new ArrayList<>();
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) row.add(1);
else row.add(triangle.get(i - 1).get(j - 1) + triangle.get(i - 1).get(j));
}
triangle.add(row);
}
// 2. 計算最大數字寬度(最後一行中間最大)
int maxNumWidth = String.valueOf(triangle.get(rows - 1).get(rows / 2)).length();
int colWidth = maxNumWidth + 1; // 加一空格間隔
// 3. 列印置中
for (int i = 0; i < rows; i++) {
// 前導空格
System.out.print(" ".repeat((rows - 1 - i) * colWidth));
for (int num : triangle.get(i)) {
System.out.printf("%" + colWidth + "d", num);
}
System.out.println();
}
}
輸出效果更優雅,適應任意行數與數字寬度。
楊輝三角是經典演算法練習,核心在於「二維陣列索引映射」與「邊界條件處理」。方法二更符合數學遞推定義,代碼簡潔健壯。實務中可結合 List<List<Integer>> 動態存儲,配合 printf 格式化輸出,獲得最佳視覺效果。