1. 程式人生 > 其它 >Python 計算正整數n劃分成一系列正整數之和的種類數量

Python 計算正整數n劃分成一系列正整數之和的種類數量

 

def partition(n: int) -> list:
    """
    整數劃分問題
    將正整數n表示成一系列正整數之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。
    正整數n的這種表示稱為正整數n的劃分。求正整數n的不同劃分個數。
    如果設p(n)為正整數n的劃分數,則難以找到遞迴關係,因此考慮增加一個自變數:將最大加數n1不大於m的劃分個數記作q(n,m)。可以建立q(n,m)的如下遞迴關係。
    q(n,m) = | 1                     m,n = 0
             | q(n,n)                n < m
             | 1 + q(n,n-1)          n = m
             | q(n,m-1) + q(n,m)     n > m > 1
    正整數n的劃分數p(n)=q(n,n)
    例如,正整數6有如下11種不同的劃分:
    6;
    5+1;
    4+2,4+1+1;
    3+3,3+2+1,3+1+1+1;
    2+2+2,2+2+1+1,2+1+1+1+1;
    1+1+1+1+1+1
    :param n:
    :return: 返回多少種劃分種類
    
""" return partition_1(n,n) def partition_1(n: int,m: int) -> list: """ 整數劃分問題 將正整數n表示成一系列正整數之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。 正整數n的這種表示稱為正整數n的劃分。求正整數n的不同劃分個數。 如果設p(n)為正整數n的劃分數,則難以找到遞迴關係,因此考慮增加一個自變數:將最大加數n1不大於m的劃分個數記作q(n,m)。可以建立q(n,m)的如下遞迴關係。 q(n,m) = | 1 m,n = 0 | q(n,n) n < m | 1 + q(n,n-1) n = m | q(n,m-1) + q(n,m) n > m > 1 正整數n的劃分數p(n)=q(n,n) 例如,正整數6有如下11種不同的劃分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1 :param n: :param m: 最大劃分數字不超過m的劃分數 :return: 返回多少種劃分種類
""" if n <= 0: return -1 else: if n == 1 or m == 1: return 1 # 邊界條件 elif n < m: return partition_1(n, n) # 遞迴方程 elif n == m: return 1 + partition_1(n, n-1) # 遞迴方程 else: return partition_1(n, m-1) + partition_1(n-m, m) #
遞迴方程