逐行构造杨辉三角,边界为 1,中间元素等于上一行相邻两个数之和。
OJ: luogu
题目 ID: P5732
难度:入门
标签:模拟矩阵递推python
日期: 2026-07-15 18:58
题意
输入 n,输出杨辉三角前 n 行。
思路
杨辉三角每一行两端都是 1。中间位置由上一行相邻两个数相加得到:
text
current[col] = previous[col - 1] + previous[col]因此可以从第 0 行开始逐行构造。每次先创建长度为 row + 1、全是 1 的列表,再填中间位置。
这题是二维列表和递推入门,正解已经直接对应定义,不创建 brute.py。
Python 知识
/home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:使用int(input())读取单个整数,使用print(*row)输出一行数字。/home/rainboy/mycode/hugo-blog/content/program_language/python/oj_input_output_cheatsheet.md:多行输出可以逐行print。current = [1] * (row + 1)创建当前行。range(1, row)只枚举当前行的中间位置。
代码
python
n = int(input())
triangle = []
for row in range(n):
current = [1] * (row + 1)
for col in range(1, row):
current[col] = triangle[row - 1][col - 1] + triangle[row - 1][col]
triangle.append(current)
for row in triangle:
print(*row)cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-07-27 00:00
* update_at: 2026-07-27 00:00
*/
#include <bits/stdc++.h>
using namespace std;
int a[25][25]; // a[row][col] 存储杨辉三角
int n;
int main() {
cin >> n;
for (int r = 1; r <= n; r++) {
a[r][1] = 1; // 第一列始终为 1
a[r][r] = 1; // 对角线始终为 1
// 中间元素等于上一行相邻两个数之和
for (int c = 2; c < r; c++) {
a[r][c] = a[r - 1][c - 1] + a[r - 1][c];
}
}
for (int r = 1; r <= n; r++) {
for (int c = 1; c <= r; c++)
cout << a[r][c] << " ";
cout << "\n";
}
return 0;
}Pythonic 写法
由上一行用列表推导生成当前行中间元素:
python
n = int(input())
triangle = [[1]]
for row in range(1, n):
prev = triangle[-1]
triangle.append([1] + [prev[i] + prev[i + 1] for i in range(row - 1)] + [1])
for row in triangle:
print(*row)复杂度
一共输出约 n^2/2 个数字,时间复杂度是
总结
杨辉三角的关键是“边界为 1,中间来自上一行”。逐行构造最适合入门学习。