Python中基于列表理解的Pascal三角迭代算法

2024-09-28 23:25:41 发布

您现在位置:Python中文网/ 问答频道 /正文

为了练习起见,我尝试用Python列表理解来表达Pascal's Triangle,并以迭代的方式来实现这一点。我在Python中将Pascal的三角形表示为:

tri = [[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], ...]

当我迭代的时候,我需要以某种方式访问之前计算的三角形的线,我试图在不声明局部变量的情况下完成这项工作。在

到目前为止,我有这个:

^{pr2}$

有什么想法吗?在

编辑:正如@brc所指出的,这是一个关于如何和/或何时使用列表理解的糟糕例子。在


Tags: 声明编辑列表方式情况tri中将例子
3条回答

遵守你强加给你自己的所有稍微有些疯狂的限制,我能想到的唯一的简化就是这里:

[d.setdefault(j, [sum(d[len(d)-1][max(i, 0):i + 2]) for i in range(-1, j)])
 for j, d in enumerate([{0: [1]}] * 5)]

至少这比你的版本短,并且去掉了所有的条件表达式。当然还是很疯狂。在

您可以简单地使用binomial coefficients的定义: 在

from math import factorial
tri = [[factorial(n) // (factorial(k) * factorial(n - k)) for k in range(n+1)]
  for n in range(height)]

由于需要显式迭代方法,所以我将使用迭代器。在

def bincoeff(num=None):
    from math import factorial
    if num is None:
        it = iter(lambda: True, False) # waiting for Godot
    else:
        it = xrange(num)
    for _ in it:
        yield [factorial(n) // (factorial(k) * factorial(n - k)) for k in range(n+1)]

有了这个发电机,你可以

  • 建立列表:

    bc = list(bincoeff(100))
    
  • 达到某个最大值:

    for bc in bincoeff():
        if len(bc) > 100: break
        print bc
    
  • 。。。

相关问题 更多 >