1. 程式人生 > >遞迴:整數劃分的java程式設計實現

遞迴:整數劃分的java程式設計實現

整數劃分:

     正整數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));

	}

}