Python练习题 生成器 - 廖雪峰的官方网站
原网址:https://www.liaoxuefeng.com/wiki/1016959663602400/1017318207388128
题目:
杨辉三角定义如下:
1
/ \
1 1
/ \ / \
1 2 1
/ \ / \ / \
1 3 3 1
把每一行看做一个list,试写一个generator,不断输出下一行的list:
题目开头:
# -*- coding: utf-8 -*-
def triangles():
pass
测试结果应该为:
# 期待输出:
# [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]
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 10:
break
for t in results:
print(t)
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('测试失败!')
解答:
使用了评论区的答案,自己没想出来,留档一下。
def triangles():.
# 作为第一排的列表。
L = [1]
while True:
# 生成器函数遇到yield直接返回值,下次再被调用时,从yield下方继续执行语句。
yield L
# 设计两个错开的列表
X = [0] + L
Y = L + [0]
L = [X[i] + Y[i] for i in range(len(X))]
结果:
结果正确 (别人的答案)
结论:
思考:
每一行第一个和最后一个数为1。
除了两侧的1,中间的数等于上排与它相同位置的数+上排与它位置-1的数。
答案思路:
用两个错位的列表的值相加,这一列有几个数就加几次。
如杨辉三角第四列的值为[1, 3, 3, 1]。
通过X=[0,1,2,1]、Y=[1,2,1,0]。
使得相同位置上的数如X[0]与Y[0]相加,得到正确结果。
感叹:
山外有山,人外有人。
不积跬步无以至千里啊。
还是得好好努力学习,分析思路。
我在做这题的时候脑子一团浆糊,甚至不知道从何入手:
- 首先是新接触的生成器概念
- 其次是还没用熟的列表生成式
- 再次是不知道怎样在遍历中使中间的数用上排与它相同位置的数+上排与它位置-1的数。
在做一件事之前,永远不要臆想它的困难与容易程度,只有做了才能明白…体悟生命的意义或许就是不断实践,去检验真实的世界…