整數劃分定義與解析(遞迴)

2021-07-03 17:03:36 字數 1373 閱讀 2168

1.背景:整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都將涉及。

2.定義:所謂整數劃分,是指把乙個正整數n寫成如下形式:

n=m1+m2+…+mi; (其中mi為正整數,並且1 <= mi <= n),則為n的乙個劃分。

如果中的最大值不超過m,即max(m1,m2,…,mi)<=m,則稱它屬於n的乙個m劃分。這裡我們記n的m劃分的個數為f(n,m);

例如當n=4時,他有5個劃分,,,,,;

注意4=1+3 和 4=3+1被認為是同乙個劃分。

該問題是求出n的所有劃分個數,即f(n, n)。下面我們考慮求f(n,m)的方法;

3.遞迴法:

根據n和m的關係,考慮以下幾種情況:

(1)當n=1時,不論m的值為多少(m>0),只有一種劃分即;

(2)當m=1時,不論n的值為多少,只有一種劃分即n個1,;

(3) 當n=m時,根據劃分中是否包含n,可以分為兩種情況:

(a). 劃分中包含n的情況,只有乙個即;

(b). 劃分中不包含n的情況,這時劃分中最大的數字也一定比n小,即n的所有(n-1)劃分。

因此 f(n,n) =1 + f(n,n-1);

(4) 當n

4.解析:

當n=6的時候

總共11種劃分方法;

程式第一步呼叫f(6,6):這個時候將整數的劃分數目為1(即)+f(6,5);//第一步作用將集合與6的5劃分分開

程式第二步呼叫f(6,5):這個時候此部分的劃分數目為f(1,5)(即)+f(6,4);//第二步作用將集合與6的4劃分分開

程式第三步呼叫f(6,4):這個時候此部分的劃分數目為f(2,2)(即)+f(6,3);//第三步將集合與6的3劃分分開

… 程式第六步呼叫f(6,1):滿足條件if(n==1||m==1)直接return 1;

///

// //注:由此看出f(n-m, m)與f(n,m-1)兩個函式的作用

// f(n,m-1)的作用是逐步遞迴,使其逐步接近終點

// f(n-m, m)的作用是對6的5劃分中的第5行、6的4劃分中的第4行

// 等進行排序

// 例:6的4劃分的第4行是,即f(2,2)是

//

// 於是便通過乙個遞迴函式從複雜至簡單,乙個每行排序的函式,

// 從6->5->4->3->2->1一直排序得出最終的結論,11種

// ///

整數劃分(遞迴)

整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都將涉及。所謂整數劃分,是指把乙個正整數n寫成如下形式 n m1 m2 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m1,m2,mi m,則稱它屬於n的乙個m劃分。這裡我們...

整數劃分(遞迴)

package test04 元素n的劃分,即存在某些數,n1,n2,n3,n4.使得n1 n2 n 比如6的劃分共有11種,count 6,4 9 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 publi...

整數劃分(遞迴)

將正整數n表示成一系列正整數之和 n n1 n2 nk 例如對於正整數6 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 1 所以對於正整數6有p 6 11中劃分 在正整數n的所有不同劃分中,將最大加數n1不...