递归函数: 用函数自身定义的函数
递归算法:直接或间接调用自身的算法
递归典型例子:Fibonacci数列,汉诺塔
eg:
将正整数 n 表示成一系列正整数之和。
n = n1+ n2 +……+ nk
正整数n的不同划分个数称为正整数n的划分数,记作P(n)
整数划分问题就是求出P(n)。
分析:求 正整数 6 的划分数
n=6 n=3+3
n=5+1 n=3+2+1
n=4+2 n=3+1+1
n=4+1+1 …..
P(6) =11
记 q(n,m)为在 n 的所有不同划分中,最大加数不大于m的划分数。
例如: q(6,1)=1 即 6=1+1+1+1+1+1
q(6,2)=4 即 6=2+2+2
6=2+2+1+1
6=2+1+1+1+1
6=1+1+1+1+1+1
q(6,6)=11
q(n,1)=1 n>=1
q(n,m)=q(n,n) m>=n (最大加数不能大于n)
q(n,n) = 1+ q(n,n-1) (n的划分由n1 =n的一种划分
和ni <=n-1的划分组成)
q(n,m)=q(n,m-1)+q (n-m, m)
(n的划分由ni <=m-1的划分
和 n1=m, 其余加数ni <=m的划分组成
int q(int n,int m){
if(n<1||m<1) return 0;
if(n==1||m==1) return 1;
if(m>n) return q(n,n);
if(m==n) return 1+q(n,m-1);
return q(n,m-1)+q(n-m,m);
}