递归——整数划分问题
问题描述
将正整数n表示成一系列正整数之和,n=n1+n2+…nk;其中n1>=n2>=…nk。
正整数n的这种表示方式称为正整数n的划分。正整数n嗯等不同划分个数成为正整数n的划分数,记作为p(n);
例如:正整数6有如下11种不同的划分,所以p(6) = 11
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;
在正整数n的所有不同的划分中,将最大加数n1不大于m划分个数记作q(n,m)
可以建立q(n,m)的递归关系如下:
程序代码
package ch01;
import java.util.Scanner;
public class zhengshuhuafen {
public static int q(int n,int m) {
if((n<1)||(m<1)) return 0;
if((n == 1)||(m == 1)) return 1;
if(n<m) return q(n, m);
if(n == m) return q(n, m-1)+1;
return q(n, m-1)+q(n-m, m);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入正整数n");
int n = scanner.nextInt();
System.out.println("请输入划分的最大整数m");
int m = scanner.nextInt();
System.out.print("输出划分数:"+q(n, m));
}
}