递归:整数划分的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



你可能感兴趣的:(算法,java,递归和分治,整数划分)