遞迴:整數劃分的java程式設計實現
阿新 • • 發佈:2019-01-07
整數劃分:
正整數n表示成一系列正整數之和:
n=n1+n2+n3...+nk(其中,n1>=n2>=n3...>=nk>=1,k>=1),p(n)就是正整數n的不同劃分個數,即正整數的劃分數。
那麼在正整數n的所有不同劃分中,把最大加數不大於m的劃分個數記作q(n,m)。那麼其遞迴關係如下:
(1)q(n,1)=1,n>=1
其中m=1,即最大加數只能為1,劃分情況只有一種:n=1+1+1+.....+1;
(2)q(n,m)=q(n,n),m>=n
由於最大加數大於等於正整數n,所有最大加數只能是n;
(3)q(n,n)=1+q(n,n-1)
最大加數為n時,只有一種情況。剩下的是最大加數為n-1時的劃分數;
(4)q(n,m)=q(n,m-1)+q(n-m,m) ,n>m>1
當正整數n大於最大加數m時,q(n,m-1)表示最大加數小於等於m-1時的劃分數,那麼再加上最大加數為m時的劃分數。最大加數為m時,最大加數已經固定了,剩下的就是正整數n減去最大加數m剩下的整數n-m的劃分數,即q(n-m,m)。
程式:
import java.util.Scanner; public class IntDivision { /** * 正整數n表示成一系列正整數之和: * n=n1+n2+n3...+nk(其中,n1>=n2>=n3...>=nk>=1,k>=1) * p(n)就是正整數n的不同劃分個數,即正整數的劃分數 */ int intdivision(int n,int m){ if (n<1||m<1) return 0; if(n==1||m==1) return 1; if(n<m) return intdivision(n, n); if(n==m) return intdivision(n, m-1)+1; return intdivision(n, m-1)+intdivision(n-m, m); } public static void main(String[] args) { Scanner in=new Scanner(System.in); System.out.print("輸入需要劃分的正整數"); int n=in.nextInt(); System.out.print("輸入最大加數"); int m=in.nextInt(); IntDivision id=new IntDivision(); System.out.println("整數"+n+"在最大加數為"+m+"的情況下"+"的劃分數是:"+id.intdivision(n, m)); } }