生成这个数字序列的更清晰方法是什么?

2 投票
3 回答
2870 浏览
提问于 2025-04-18 15:37

我需要生成一个像这样的列表:

[0, 2, 6, 12, 20, 30, 42, 56, 72, 90]

这是我现在的代码

g = lambda x: x + g(x - 2) if x > 0 else 0
print([g(2 * i) for i in range(10)])

有没有更简单、更直接的方法来生成这个序列呢?

3 个回答

0
list1 = [x+(x ** 2) for x in range(10)]
print list1

Output : [0, 2, 6, 12, 20, 30, 42, 56, 72, 90]

这段代码会给你想要的序列。

2

你的算法,正如 @wim 已经指出的,是用来计算“乘积数”的,可以简单总结为:

n 个乘积数是前 n 个偶数的和

所以你可以这样写:

def pronic(n):
    """Create a list of the first n pronic numbers."""
    return [sum(range(0, 2*i+1, 2)) for i in range(n)]

不过,虽然这段代码清楚地展示了你采用的方法,但另一种定义可以让它变得更简洁,正如 @wim 的回答所示。

你也可以考虑把它实现成一个生成器:

def pronic():
    """Generate the pronic numbers."""
    i = 0
    while True:
        yield i * (i + 1)
        i += 1
12

这些看起来是前几个连乘数。也就是说,这些数字是两个连续整数相乘的结果,形式是n * (n + 1)

sequence

我是在OEIS网站上找到这些的。用列表推导式生成这些数字非常简单:

>>> [x*(x + 1) for x in range(10)]
[0, 2, 6, 12, 20, 30, 42, 56, 72, 90]

撰写回答