Discuss / Python / 杨辉和贾宪的爱恨情仇

杨辉和贾宪的爱恨情仇

Topic source
def triangles():
    Jia_xian = [1]
    while 1:
        Yang_hui = [1]
        for i in range(len(Jia_xian)-1):
            Yang_hui.append(Jia_xian[i]+Jia_xian[i+1])
        Yang_hui.append(1)
        yield Jia_xian
        Jia_xian = Yang_hui
    return 0

这个 return 0 可太虚伪了哈哈哈

可以用列表生成式做少量的简化,如

def mytriangles():
    Jia_xian = [1]
    while 1:
        yield Jia_xian
        Jia_xian = [1] + [Jia_xian[i] + Jia_xian[i-1]
                          for i in range(1,len(Jia_xian))]+[1]

可惜不能回避 for i in range(), 因为需要用序号 i 和 i+1 来同时调用序列中的两个元素。

看底下评论里,迭代前在末尾加个0,这样首项迭代时正好引用到末项这个0,这个技巧极其聪明。

def mytriangles():
    Yang_hui = [1]
    while 1:
        yield Yang_hui
        Yang_hui.append(0)
        Yang_hui = [Yang_hui[i] + Yang_hui[i-1] for i in range(len (Yang_hui))]

如果是for i in Jia_xian,那么不能简单地用 i 够到它的下一个元素。当然这也不是没有办法,那就是用别的变量记录 i 的旧值。

def mytriangles():
    Jia_xian = [1]
    while 1:
        yield Jia_xian
        Yang_hui, j = [], 0
        for i in Jia_xian:
            Yang_hui.append(i + j)
            j = i
        Jia_xian = Yang_hui + [1]

这个也能得到正确的答案。可惜列表生成式无法记录旧值。


  • 1

Reply