我有一个简单的列表list = [0,1,2,3,4,5,6,7,8,9,10,11,12]
。对于列表中的任何值x(其中x>;=4以避免错误),我需要为每个值y
获取可能的“选择4”组合的累计数,其中y < x
。你知道吗
例如,对于x = list[7]
,我想得到所有累积的计数,选择4个组合作为数字<;=7、6、5和4,即7c4、6c4、5c4和4c4。这些值分别为35、15、5和1,因此累积计数为56。你知道吗
我可以通过简单的循环和获得组合来做到这一点:
import operator as op
from functools import reduce
def ncr(n, r):
r = min(r, n-r)
numer = reduce(op.mul, range(n, n-r, -1), 1)
denom = reduce(op.mul, range(1, r+1), 1)
return numer / denom
cumu_comb = 0
for i in list[:3:-1]:
cumu_comb += ncr(i - 1, len(list) - i)
这感觉像是一个缓慢/暴力的方法;有数百万次的迭代,这将不是理想的方法。是否有一个数学表示法来计算所有值的累积组合<;x?像阶乘组合函数?你知道吗
你可以用组合公式很容易地解决这个问题。你知道吗
出于这个原因,这可能更像是一个maths问题,但我离题了。你知道吗
我们可以使用
math.factorial()
而不是使用循环来查找数字的阶乘;因为这使用C实现,所以速度会快得多。你知道吗我们也可以使用列表理解将其填充到一行中,尽管我将输入和输出分开放置,它们可以组合在一起。请记住,我不会提出一种方法来防止此代码中的错误,因为问题意味着我们应该能够假设所有x都大于4。你知道吗
要找到累积计数,我们可以写:
例如,如果我们将
x
输入为7:[4, 5, 6, 7]
。你知道吗这可以说是。你知道吗
需要注意的是,在这个目标本身中,一个人可能会处理大量的数据。根据版本的不同,这可能是一个问题。
相关问题 更多 >
编程相关推荐