[英]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 的值0
、 1
和2
分配給combination(3, 1)
的每個元素。 換句話說,取第一個元素[0]
。 我們將 append 0
、 1
和2
加入到這個列表中,結果是[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.