題目需求
1
2 2
3 3 3
...
n n n ... n (共 n 個 n)
迴圈版 (直觀、高效)
void print_triangle_loop(int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
printf("%d ", i);
}
putchar('\n');
}
}
遞歸版 (教學展示調用棧)
// 輔助:打印單行
void print_line(int num, int count) {
if (count == 0) { putchar('\n'); return; }
printf("%d ", num);
print_line(num, count - 1);
}
// 主遞歸
void print_triangle_recur(int n, int cur) {
if (cur > n) return;
print_line(cur, cur);
print_triangle_recur(n, cur + 1);
}
// 調用
print_triangle_recur(5, 1);
遞歸版單函數 (尾遞歸優化友好)
void triangle_recur_single(int n, int row, int col) {
if (row > n) return;
if (col > row) {
putchar('\n');
triangle_recur_single(n, row + 1, 1);
} else {
printf("%d ", row);
triangle_recur_single(n, row, col + 1);
}
}
輸出格式微調
- 題目要求「每行數字間空格分隔,行末換行」→ 上方代碼符合。
- 若要求 **對齊** (如每佔 3 字符):
printf("%-3d", i) 或 printf("%3d", i)。
教學重點對比
| 維度 | 迴圈 | 遞歸 |
| 可讀性 | 高 (直觀) | 中 (需理解調用棧) |
| 記憶體 | O(1) | O(n) 棧深度 |
| 效能 | 極快 | 函數調用開銷 |
| 適用場景 | 生產代碼 | 教學/樹形結構/分治演算法 |