0
点赞
收藏
分享

微信扫一扫

Python练习题 生成器 - 廖雪峰的官方网站

yellowone 2022-02-11 阅读 66

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的数。

在做一件事之前,永远不要臆想它的困难与容易程度,只有做了才能明白…体悟生命的意义或许就是不断实践,去检验真实的世界…


Alt

举报

相关推荐

0 条评论