⊙▽⊙我是不会告诉你秘密的! 2024-09-01 20:19 采纳率: 100%
浏览 10
已结题

Python3:通过生成器生成杨辉三角形

在 anaconda 环境中的 Jupyter Note 中运行 Python 3 代码。

要解决的问题:想用生成器 generator 生成杨辉三角形

我的代码片段:


```python
def triangles():
    result = [1]
    while True:  
        yield result  
        resultcpy = result
        result = []
        resultcpy.insert(0,0)
        for i in list(range(len(resultcpy)-1)):
            result.append(resultcpy[i]+resultcpy[i+1])
        result.append(1)
    return "done"

遇到的问题: 当我运行以下代码时

```python
g = triangles()
next(g)
next(g)
next(g)

能正确输出结果:第一次结果为 [1];第二次结果为 [1,1];第三次结果为 [1,2,1]。但是当运行以下代码时,结果是错误的

n = 0
results = []
for t in triangles():
    results.append(t)
    n = n + 1
    if n == 10:
        break

for t in results:
    print(t)

错误结果为

[0, 1]
[0, 1, 1]
[0, 1, 2, 1]
[0, 1, 3, 3, 1]
[0, 1, 4, 6, 4, 1]
[0, 1, 5, 10, 10, 5, 1]
[0, 1, 6, 15, 20, 15, 6, 1]
[0, 1, 7, 21, 35, 35, 21, 7, 1]
[0, 1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

猜测和 list 是可变的有关。自己写的代码既不简介也不美观,尽管网上有正确答案,但是还是不知道本质原因,很困惑,在此请各位赐教,感谢!

  • 写回答

1条回答 默认 最新

  • 梦幻精灵_cq 2024-09-01 20:29
    关注
    • 问题出在您的生成器

      img


      完全可以利用杨辉三角排列特性,改写生成器逻辑。

    我偷个懒,让我的ai书童给您说原理:
    确实,您提供的生成器函数版本更为简洁和高效。原始版本的生成器函数通过显式地迭代上一行并计算下一行的每个元素,而您的版本利用了 Python 的内置函数和操作来简化这一过程。

    您的版本:

    
    def triangles():
        result = [1]
        while True:  
            yield result  
            a, b = [0] + result, result + [0]
            result = [sum(i) for i in zip(a, b)]
    

    这里使用了列表的加法和列表推导,以及 zip 函数来隐式地创建相邻元素对并计算它们的和,从而生成杨辉三角的下一行。这种方法不仅代码量更少,而且更易于理解和维护。

    原始版本可能看起来更“复杂”,因为它涉及到更多的细节操作,如手动迭代和元素相加。相比之下,您的版本利用了 Python 的语言特性,以更为优雅和高效的方式实现了相同的功能。

    简洁和高效的代码通常是编程中的一个好目标,因为它可以减少出错的可能性,并使得代码更易于他人阅读和维护。您的这个改写示例很好地展示了如何通过利用 Python 的强大功能来简化代码逻辑。😄😄


    
    def triangles():
        result = [1]
        while True:  
            yield result  
            a, b = [0] + result, result + [0]
            result = [sum(i) for i in zip(a, b)]
    
    
    g = triangles()
    print(next(g))
    print(next(g))
    print(next(g))
    
    
    n = 0
    results = []
    for t in triangles():
        results.append(t)
        n = n + 1
        if n == 10:
            break
    for t in results:
        print(t)
        
    
    
    n = 0
    for t in triangles():
        print(t) 
        n = n + 1
        if n == 10:
            break
    
    
    n = int(input('\n输入层数:').strip())
    g = triangles()
    
    for i in range(n):
        print(next(g))
    
    • 代码运行效果截屏

      img


      各种生成器的调用,都可以正常输出“杨辉三角”😛

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月5日
  • 已采纳回答 10月28日
  • 创建了问题 9月1日