簡體   English   中英

獲取有序連續列表中 x 降序值的累積組合(x 選擇 y)

[英]Getting cumulative combinations (x choose y) for descending values of x in ordered consecutive list

我有一個簡單的列表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 的累積組合? 像階乘組合 function 之類的東西?

您可以使用組合公式輕松解決此問題。

出於這個原因,它可能被認為更像是一個數學問題,但我離題了。

我們可以使用math.factorial()而不是循環找到數字的階乘; 因為這使用 C 實現,所以它會快得多。

我們也可以使用列表推導將其填充到一行中,盡管我將輸入和輸出分開放置,它們可以捆綁在一起。 請記住,我不會在此代碼中提供防止錯誤的方法,因為問題暗示我們應該能夠假設所有x都大於 4。

要找到累積計數,我們可以編寫:

import math

x = int(input("x: "))
a = sum([math.factorial(i)/(math.factorial(4) * math.factorial(i - 4)) for i in n[4:x+1]])
print(a)

例如,如果我們輸入x為 7:

  • 我們將遍歷列表[4, 5, 6, 7]
  • 在每個元素上,我們執行組合公式, k = 4 (如問題中所述,盡管這可以根據個人情況進行更改,只需更改 4s)。 由於我們的列表迭代,這進入了一個列表。
  • 最后將所有元素加起來。

這可能被描述為。

重要的是要注意,就這一目標本身而言,一個人可能會處理大量數字。 根據版本,這可能是一個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM