將一個(gè)整數(shù)劃分為多個(gè)整數(shù)想加的形式狂男,并計(jì)算劃分方法沸呐。
例:6的劃分:
6=5+1
6=4+2
6=4+1+1
6=3+3
6=3+2+1
6=3+1+1+1
6=2+2+2
6=2+2+1+1
6=2+1+1+1+1
6=1+1+1+1+1+1
問題分析
這個(gè)問題顯然要構(gòu)造遞歸關(guān)系來解決臭猜,碰到這個(gè)問題時(shí)赦肋,我們很容易知道當(dāng)一個(gè)整數(shù)被分為都是1時(shí)惦费,這時(shí)應(yīng)該已經(jīng)完成了整個(gè)遞歸的過程赌莺。如果你已經(jīng)發(fā)現(xiàn)了這一出口薪棒,那我們就開始對劃分的方式進(jìn)行分類手蝎。
筆者這里分為兩類:
第一類 | 第二類 |
---|---|
6=5+1 | 6=3+3 |
6=4+2 | 6=2+2+2 |
6=4+1+1 | |
6=3+2+1 | |
6=3+1+1+1 | |
6=2+2+1+1 | |
6=2+1+1+1+1 | |
6=1+1+1+1+1+1 |
我這里就簡單的使用是否含有1作為界限,當(dāng)然也可以使用別的界限俐芯,只不過遞歸的形式就不同了棵介。給定一個(gè)整數(shù)N,M是N中不超過N的最大整數(shù)。
第一類就可以寫成F(N,M-1)吧史,第二類寫成F(N-M,M)邮辽,即遞歸表達(dá)式
F(N,M)=F(N,M-1)+F(N-M,M)
public static int divInt(int n,int m){
if (m == 1) return 1;
if (n <= m) return 1 + divInt(n, n - 1);
if (m > 1) return divInt(n, m - 1) + divInt(n - m, m);
return 0;
}