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, 9, 36, 84, 126, 126, 84, 36, 9, 1]
2、思考过程:
将整个输出图形,可以认为是行列元素组成的。
整个思路的核心简单来说,除了首尾元素是1之外,其它元素的计算思路就是:[row][col]= [row-1][col-1]+[row-1][col]
举个例子:第四行的输出结果是:1,3,3,1,而第三行的输出结果是:1,2,1
除了首尾两个元素是1之外,3其实是上行元素1与2的和,另一个3是上一行元素2与1的和。
但是,用python实现这个过程,和其它语言有点差异性,比如Java、c++,它们都有二维数组可以使用,但是Python却没有,所有有点头疼。但是,Python有列表,每行元素可以通过列表输出。那么,具体实现过程是怎么样的呢?
3、代码实现
def triangle():
#第一行元素就是一个1
line = [1]
# 循环输出每行的元素列表
while True:
yield line
# 生成下一行,表达式为 : [1] + 上一行的两个元素之和 + [1]
line = [1] + [line[i] + line[i + 1] for i in range(len(line) - 1)] + [1]
# 控制输出行数
n = 0
# 由于triangle()其实是一个生成器Iterator,因此可以使用for循环遍历输出
for item in triangle():
print(item)
n += 1
# 输出10行的时候就结束
if n % 10 == 0:
break
4、代码分析
整个实现过程中是通过yield关键字定义生成器来实现的。
其中,
line = [1] + [line[i] + line[i + 1] for i in range(len(line) - 1)] + [1]
是理解的关键。
非常巧妙,既有列表的拼接操作,同时又使用了列表生成式,代码很简洁,但理解起来却不容易。
可以去取某个实例来理解:
比如,现在要输出第四行元素,怎么处理呢?
第三行元素是1,2,1
那么,len(line)此时是3,range(len(line)-1)的结果元素是0,1
当i = 0 时,line[i] + line[i+1] = 1+2 = 3
当i = 1 时,line[i] + line[i+1] = 2+1 = 3
在这里,range()的返回结果是从0开始的,而不是1,因此列表的元素索引也是从0开始的
最后,再利用列表拼接,将首尾的1连接起来,就得到了我们想要的本行元素列表
同样,其它行的元素也是这样的操作,那么,在外围添加一个循环条件: while True
每次输出本行元素列表,然后计算下行元素列表,循环进行。