簡體   English   中英

查找 n 個元素的所有 k 個組合長度

[英]Find all k combination length of n elements

嘿,我試圖在不使用任何模塊的情況下通過遞歸找到 n 個元素的所有 k 組合長度

例如n = 4所以[0,1,2,3]k=3所以所有的組合長度 3 是

>>>[0,0,0],[0,0,1],[0,0,2],[0,0,3],[0,0,4],[0,1,0],[0,1,1],[0,1,2]....

我試着像一棵樹一樣思考,但我沒有從這里[0,0,4]到 go 例如到這里[0,1,0]我得到的只是[0,0,0],[0,0,1],[0,0,2],[0,0,3],[0,0,4]

我們可以通過使用簡單的遞歸來達到最低限度。

def combination(n, k):
    if not k:
        return [[]]
    res = []
    nums = list(range(n + 1))
    for comb in combination(n, k - 1):
        for num in nums:
            comb_copy = comb.copy()
            comb_copy.append(num)
            res.append(comb_copy)
    return res

讓我們看看這段代碼是如何工作的。 首先,與任何遞歸問題一樣,我們建立基本情況,即當k == 0時。 在這種情況下,我們將返回一個空的嵌套列表。

如果k != 0 ,那么我們需要執行遞歸。 這個問題的要點是我們需要 append 一些數字來combination(n, k - 1)返回的結果。 例如,假設我們要獲得combination(2, 2)的結果。 combination(2, 1)返回的結果將是

>>> combination(2, 1)
[[0], [1], [2]]

給定這些信息,我們如何獲得combination(2, 2) 出於某種直覺,這是我們想要的結果:

>>> combination(2, 2)
[[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]

請注意,我們需要做的就是將 append 的值012分配給combination(3, 1)的每個元素。 換句話說,取第一個元素[0] 我們將 append 012加入到這個列表中,結果是[0, 0], [0, 1], [0, 2] 這些是combination(3, 2)的前三個元素。

回到代碼,我們首先調用combination(n, k - 1)和append num到該function 調用返回的嵌套列表中的每個列表。 最后,當附加結束時,我們返回res

這里的一個很好的細節是我們創建列表的副本而不是直接附加到它。 我們這樣做是為了防止修改原始comb

這是 function 在n = 4 , k = 3時的作用:

>>> combination(4, 3)
[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 0, 4], [0, 1, 0], [0, 1, 1], [0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 2, 0], [0, 2, 1], [0, 2, 2], [0, 2, 3], [0, 2, 4], [0, 3, 0], [0, 3, 1], [0, 3, 2], [0, 3, 3], [0, 3, 4], [0, 4, 0], [0, 4, 1], [0, 4, 2], [0, 4, 3], [0, 4, 4], [1, 0, 0], [1, 0, 1], [1, 0, 2], [1, 0, 3], [1, 0, 4], [1, 1, 0], [1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4], [1, 2, 0], [1, 2, 1], [1, 2, 2], [1, 2, 3], [1, 2, 4], [1, 3, 0], [1, 3, 1], [1, 3, 2], [1, 3, 3], [1, 3, 4], [1, 4, 0], [1, 4, 1], [1, 4, 2], [1, 4, 3], [1, 4, 4], [2, 0, 0], [2, 0, 1], [2, 0, 2], [2, 0, 3], [2, 0, 4], [2, 1, 0], [2, 1, 1], [2, 1, 2], [2, 1, 3], [2, 1, 4], [2, 2, 0], [2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 2, 4], [2, 3, 0], [2, 3, 1], [2, 3, 2], [2, 3, 3], [2, 3, 4], [2, 4, 0], [2, 4, 1], [2, 4, 2], [2, 4, 3], [2, 4, 4], [3, 0, 0], [3, 0, 1], [3, 0, 2], [3, 0, 3], [3, 0, 4], [3, 1, 0], [3, 1, 1], [3, 1, 2], [3, 1, 3], [3, 1, 4], [3, 2, 0], [3, 2, 1], [3, 2, 2], [3, 2, 3], [3, 2, 4], [3, 3, 0], [3, 3, 1], [3, 3, 2], [3, 3, 3], [3, 3, 4], [3, 4, 0], [3, 4, 1], [3, 4, 2], [3, 4, 3], [3, 4, 4], [4, 0, 0], [4, 0, 1], [4, 0, 2], [4, 0, 3], [4, 0, 4], [4, 1, 0], [4, 1, 1], [4, 1, 2], [4, 1, 3], [4, 1, 4], [4, 2, 0], [4, 2, 1], [4, 2, 2], [4, 2, 3], [4, 2, 4], [4, 3, 0], [4, 3, 1], [4, 3, 2], [4, 3, 3], [4, 3, 4], [4, 4, 0], [4, 4, 1], [4, 4, 2], [4, 4, 3], [4, 4, 4]]

請注意,通過實現動態編程之類的東西,我們可以在這里變得更漂亮,但這是您以后可能要考慮的優化細節。

您可以使用itertools.combinations

import itertools
itertools.combinations('ABCD', 2)

暫無
暫無

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

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