为什么我的发电机功能总是返回相同的值?

时间:2014-05-24 17:18:55

标签: python list generator pascals-triangle

我想为伯努利三角形构建一个生成器,三角形i行中的数字j是pascal中第一个i数字的部分和第39行j中的三角形。

三角形看起来像这样:

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 个答案:

答案 0 :(得分:4)

首先,您只调用next一次,而不是每次迭代调用它。其次,您从未在每次迭代中更新行。此外,您的部分金额和yield已互换。我通过在while循环中调用next并在其外部初始化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

答案 1 :(得分:1)

您需要计算Pascal三角形行的部分和。这是我编写代码的方式。

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))