簡體   English   中英

在精確的k個部分中獲得n。 遞歸和分區算法。 p(n,k)

[英]Get n in exact k parts. Recursion and partition algorithm. p(n,k)

我想枚舉k個部分中n的所有分區。

因此對於p(5,3)我將得到k = 3 =>(3,1,1),(2,2,1)的2個分區。

這是我通過搜索和查找stackoverflow發現的:

def p(n,k):
    lst = []
    if n < k:
        return lst
    elif k == 1:
        return lst
    elif k == n:
        return lst
    else:
        p(n-1, k-1) 
        p(n-k, k)
    return lst

^^^^這是我想要的形式,

實際上,找到k個部分的和很容易,您將返回p(n-1,k-1)+ p(nk,k)。 對於我來說,我需要像[[3,1,1),(2,2,1)]這樣列出每個元素。

我的主要問題是遞歸“構建”那些分區。 您將如何解決?

編輯

如果得到基本情況k = 1,則加+ 1,k-1次。 (4,1)然后(4,1,1)

如果得到基本情況k = n,則拆分並為每個部分刪除一個。

像這樣:(3,3)然后(3,3,3)然后(2,2,2)

如果得到基本情況k <n,則無

基本上,我的問題是從基本情況到頂部“堆疊”並獲得完整列表p(6,3)= [(2,2,2),(4,1,1),(3,2 ,1)]

在此處輸入圖片說明

我將在遞歸函數中添加第三個參數m ,這是元素在分區中可以具有的最大值。 然后,我將這樣定義函數:

def p(n, k, m=None):
    if m is None:
        m = n - k + 1 # maximum can be n - k + 1 since minimum is 1
    if k == 0:
        if n == 0:
            yield ()
        return
    for i in xrange(1, m + 1): # first could be from 1 to the maximum
        # the rest of the sum will be n - i among k - 1 elements with
        # maximum i
        for t in p(n - i, k - 1, i):
            yield (i, ) + t

例子:

>>> list(p(10, 3))
[(4, 3, 3), (4, 4, 2), (5, 3, 2), (5, 4, 1), (6, 2, 2), (6, 3, 1), (7, 2, 1), (8 , 1, 1)]
>>> list(p(6, 2))
[(3, 3), (4, 2), (5, 1)]

暫無
暫無

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

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