我有一个很长的列表(大数字),比如说:
a=[4,6,7,2,8,2]
我需要获得此输出:
b=[4,24,168,336,2688,5376]
每个b[i]=a[0]*a[1]...*a[i]
我试图以这种方式递归地执行此操作:
b=[4] + [ a[i-1]*a[i] for i in range(1,6)]
但是(错误的)结果是:[4, 24, 42, 14, 16, 16]
我不想每次都计算所有产品,我需要一种有效的方法(如果可能的话),因为列表很长
目前这对我有用:
b=[0]*6
b[0]=4
for i in range(1,6): b[i]=a[i]*b[i-1]
但它太慢了。有任何想法吗?是否有可能避免“为”或以其他方式加速它?
答案 0 :(得分:0)
您可以逐步计算产品,因为下一次计算在很大程度上取决于前一次计算。
我的意思是:
1)为第一个i - 1
数字计算产品
2)第i个产品将等于最后a[i]
个数字的i - 1
*产品
此方法称为dynamic programming
动态编程(也称为动态优化)是一种解决复杂问题的方法,将其分解为更简单的子问题集合,只解决一次这些子问题,并存储其解决方案
这是实施:
a = [4, 6, 7, 2, 8, 2]
b = []
product_so_far = 1
for i in range(len(a)):
product_so_far *= a[i]
b.append(product_so_far)
print(b)
此算法以线性时间(O(n)
)工作,这是您为此类任务获得的最有效的复杂性
如果您想进行一些优化,可以将b
列表生成为预定义的长度(b = [0] * len(a)
),而不是追加,您可以在循环中执行此操作:
b[i] = product_so_far