这个学期开了一门《算法设计与分析》的课程,现在学了递归,讲了一个有关整数划分的例子。
对于各种情况下有着不同的划分,其中
①n=1或m=1
②n<m
③n=m
④n>m>1(q(n,m) = q(n,m-1) + q(n-m,m))
中前三个都好理解,但是第4个有些不太好理解,我理解了一下,可以认为是q(n,m)先划分q(n,m-1)和将n划分为一定有m的,
所以至少需要一个m,即从n中拿出一个m即固定有一个m,剩下的数就变成了(n-m),再将这剩下的继续划分。
这样就形成了持续的递归。
递归其实最难的就是找到递归的条件,代码其实是比较简单的。
#include<stdio.h> int equationCount(int n, int m) { if(n == 1 || m==1) return 1; else if(n < m) return equationCount(n,n); else if(n == m) return equationCount(n,n-1) + 1; else if(n > m) return equationCount(n,m-1) +equationCount(n-m,m); } int main() { int n; while(scanf("%d",&n)!=EOF) { printf("%d\n",equationCount(n,n)); } return 0; }