今天在学习到廖雪峰教程例中的杨辉三角的时候,很是废了一番脑筋。看了下网上的实例,结合自己的情况,发现思路卡死的原因。
因为是过来的,对list和理解不够,就特别容易卡死。
还有一个错误是对练习题题目没有理解透,要求是
n = 0
results = []
for t in triangles():
print(t)
results.append(t)
n = n + 1
if n == 10:
break
下输出结果,也就是做一个生成器
triangles()
然后用上面的代码将他输出出来,而我开始的理解还是C的方式,就是一个函数打印出所有行。理解错了。
除了这两点,其实就比较容易了。
打印出来的是个list,第一行一个元素,定义
l = [1]
第二行是2个,这里要开始理解杨辉三角的规律了。每一行的第一列和最后一列是[1],最重要的是运算基数,这个是不变的。
所以可以先假定第二行是
l = [1] + [1]
来到第三行就可以看规律了
[1, 2, 1]
第三行开始,每一行的的第二个数开始是上一个list的相邻相加,加到最末位,也就是需要这个len(list) -1次运算
这里就要用到列表生成式了。
[1]+[ l[i]+l[i+1] for i in range(len(l)-1)] + [1]
这个是这个题目最关键的一个点了,len-1个数,0+1然后是1+2……
再返回去看第一行,第二行。
第一行可以单独拿出来,可以不考虑。
第二行带入到上面的生成式,len(l)-1=0,也就是直接跳出,也是成立的。
完整的写下来就是
def triangles():
l = [1]
while True:
yield l
l = [1] + [l[i] + l[i+1] for i in range(len(l)-1)] + [1]
然后用验证代码
n = 0
results = []
for t in triangles():
print(t)
results.append(t)
n = n + 1
if n == 10:
break
if results == [
[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]
]:
print('测试通过!')
else:
print('测试失败!')
最后,感谢廖雪峰先生的无私奉献!