第16期—杨辉三角
1 问题描述
杨辉三角是中国数学史上的一个伟大成就,最早由中国南宋末年的数学家、教育家杨辉在其著作《详解九章算术》中提出的。在大约500年后的欧洲,法国数学家帕斯卡也发现了这一结论,因此杨辉三角又称为帕斯卡三角。
杨辉三角是一个无限堆成的数字金字塔,它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
杨辉三角的性质:
- 每行首尾的数字都是1
- 每行中间的各数都是它肩上两个数的和
- 第n行的数字有n项
- 第n行的项数总比n-1行多1个
请用户输入一个非负整数n, 用Python输出杨辉三角前 n 行~
2 解题思路
- 用input函数使用户输入行数
- 创建两个列表,一个用于输出最后的结果,另一个输出每一行的数字,并将其添加到第一个列表中
- 根据杨辉三角形的特点输出结果:每行首尾的数字都是1;每行中间的各数都是它肩上两个数的和
3 解题方法

n = int(input("输入需要打印的杨辉三角行数 :")) assert n > 0, "请输入正整数!" list1 = [] for i in range(n): list2 = [] if i == 0: list2 = [1] elif i == 1: list2 = [1, 1] else: for j in range(i + 1): if j == 0 or j == i: list2.append(1) else: list2.append(list1[i - 1][j - 1] + list1[i - 1][j]) list1.append(list2) space = len(list1[-1]) for i in list1: print(' ' * (space * 4 // 2), end='') for j in i: print(f"{j:<4}", end='') print() space -= 1
第1行: 用input函数获取用户输入的行数,int函数将其转化为整型,并赋值给变量 n
第2行: 用assert断言函数限定变量 n 大于0,若大于0,执行后面的代码,否则报错“AssertionError: 请输入正整数!”
第4行: 创建一个空列表list1,用于完成整个序列的循环,输出杨辉三角
第5行: 用for循环控制输出的行数
第6行: 创建另一个空列表list2,用于存储每一行的数值
第7-8行: 第一次循环i == 0,输出杨辉三角第一行
第9-10行: 第二次循环i == 1,输出杨辉三角第二行
第11-12行: 接着输出杨辉三角的其他行,变量 j 表示一行中的每一个元素,用for循环遍历每一行中的每一个元素
第13-14行: 每行首尾的数字都是1,输出每行首尾的数字 1,添加到列表list2
第15-16行: 每行中间的各数都是它肩上两个数的和,通过对双重列表的索引,获取中间这个数肩上的两个数,求和后将其添加到列表list2
以杨辉三角第3行为例
第3次循环时,i == 2, list1 = [[1], [1, 1]]
求第3行中间的数 2 时, j 进行到第二次循环,j == 1
2 等于第2行两个数值的和,即 list1中位置1的列表元素和,通过列表的索引,这两个元素分别是(list1[i - 1][j - 1] 和 list1[i - 1][j]
第17行: 将列表list2添加到列表list1
第19行: 为使杨辉三角每一行的数值能居中排列,设置每一行第一个数值前的空格数,用len函数获取list1最后一行的长度
第20行: 由于list1是二维列表,用for循环遍历list1,循环变量 i 为一维列表,即杨辉三角每一行的数值列表
第21行: 每个数值之间间隔4个空格,每一行第一个元素前的空格数为space * 4 // 2, 用end将结果输出到同一行
第22行: 在第19行for循环的基础上,嵌套一个for循环,获取杨辉三角每一行中的每一个元素
第23行: 每个数值之间间隔4个空格,用end将结果输出到同一行
第24行: 一行输出后,用print()换行输出下一行
第25行: 由于第n行的数值比n-1行多1个,所以在一次循环后,space在原有基础上减 1
运行结果如下图所示:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?