# 第16期—杨辉三角

Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。

# 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

第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
运行结果如下图所示:
16-1 杨辉三角

# 4 视频解析

高清视频讲解,请查看AI大学堂Python基础实战100例 (opens new window)
关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
AI大学堂公众号.png

更新于: 12/28/2021, 7:43:14 AM