题目描述
给你一个整数N,对这个整数进行划分,变成几个整数之和,其中,后面的数不能比前面的数大,例如:
N=6
6+0
5+1
4+2、4+1+1
3+3、3+2+1、3+1+1
2+2+2、2+2+1+1、2+1+1+1+1
1+1+1+1+1+1
一种11种
思路分析
此题如果只是简单的划分,那递归就容易写了,但是,此题要求,整数之和的式子中,后面的数不能比前面的数大,因此,如何实现后面递归的时候比前面的数小呢?所以,只能记录下前面递归的数,因此,此题递归需要两个变量。
递归出口:
n=1或者n=0时,返回1,找到一种。
递归函数:
上次相加的数max和这次的n中的较小值,就是这次能够选择的最大值,然后,从这个值开始,依次向下递归,每次减少1。
代码
public static int allSort(int n,int max){
if(n==1||n==0){
return 1;
}
int res=0;
for (int i = Math.min(n,max); i >0; i--) {
res+=allSort(n-i,i);
}
return res;
}