⊙▽⊙我是不会告诉你秘密的! 2024-09-01 20:19 采纳率: 0%
浏览 7

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


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

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 9月1日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?