为什么我的生成器函数总是返回相同的值?

2 投票
2 回答
900 浏览
提问于 2025-04-18 07:29

我想要创建一个生成伯努利三角形的程序。在这个三角形中,j 行的第 i 个数字是帕斯卡三角形中第 j 行前 i 个数字的总和。

这个三角形看起来是这样的:

enter image description here

在 Python 中可以用列表来表示这个三角形:

[[1], [1,2], [1,3,4], [1,4,7,8] 

我的生成器函数第一次输出 [1],这是对的,但之后它一直输出 [],也就是空列表!

这是我的代码:

def next_row(row):
    n = len(row)
    new_row = [row[0]] + [row[i] + row[i+1] for i in range(n - 1)] + [row[-1]]
    return new_row


def generate_pascal():
    row =[1]
    while True:
        yield row
        row=next_row(row)


def generate_bernoulli():

    row=next(generate_pascal())
    n=len(row)
    while True:
        yield row
        row=[row[0]+sum(row[0:i]) for i in range(n-1)]

2 个回答

1

你需要计算帕斯卡三角形每一行的部分和。下面是我会写的代码。

def partial_sums(xs):
    s = 0
    for x in xs:
        s += x
        yield s

def generate_bernoulli():
    for row in generate_pascal():
        yield list(partial_sums(row))
4

首先,你只调用了一次 next,而不是在每次循环中都调用它。其次,你在每次循环中都没有更新行的值。此外,你的部分和 yield 的位置也搞错了。我通过把 next 的调用放在了 while 循环里面,并在外面初始化了 pascal 生成器来修正这些问题。最后,你的求和有点不对;我也修正了这个。正确的代码如下:

def generate_bernoulli():
    pascal = generate_pascal()
    while True:
        row=next(pascal)
        n=len(row)
        row=[sum(row[0:i+1]) for i in range(n)]
        yield row

撰写回答