1. 求n!(这里附加一个限制条件:0<=n<=12)
源代码:
#include <stdio.h>int fun(int n){ if(n==0 || n==1) return 1; else return n*fun(n-1);}int main(){ int n; while(scanf("%d",&n)!=EOF) PRintf("%d!=%d/n",n,fun(n)); return 0;}程序截图:
2. 递归解决年龄问题:
有5个学生坐在一起,问第5个学生的年龄,他说比第4个学生大2岁,问第4个学生的年龄,他说比第3个学生大2岁,问第3个学生的年龄,他说比第2个学生大2岁,问第2个学生的年龄,他说比第1个学生大2岁,问第1个学生的年龄,他说他10岁。
问第2.3.4.5个学生年龄多大?
源代码:
#include <stdio.h>int age(int n){ if(n==1) return 10; else return age(n-1)+2;}int main(){ int n; while(scanf("%d",&n)!=EOF) printf("第%d个人: %d岁/n",n,age(n)); return 0;}程序截图:
3. 计算组合数C(m, n)
法一:使用组合数计算公式
源代码:
#include <stdio.h>int fun(int n) //需要注意直接使用公式时在int精度范围内可表示的数的范围十分有限,故局限性比较大{ if(n==0|| n==1) return 1; else return n*fun(n-1);}int Cmn(int m,int n){ int result; if(m<0 || n<0 || m<n) result=0; else result=fun(m)/(fun(n)*fun(m-n)); return result;}int main(){ int m,n; while(scanf("%d %d",&m,&n)!=EOF) printf("C(%d,%d)=%d/n",m,n,Cmn(m,n)); return 0;}法二:使用组合数递推公式源代码:
#include <stdio.h>int Cmn(int m,int n){ if(m<0 || n<0 || m<n) return 0; if(m==n) return 1; if(n==1) return m; return Cmn(m-1,n)+Cmn(m-1,n-1);}int main(){ int m,n; while(scanf("%d %d",&m,&n)!=EOF) printf("C(%d,%d)=%d/n",m,n,Cmn(m,n)); return 0;}程序截图:
4. 用递归方法求解两个正整数的最大公约数
源代码:
#include <stdio.h>int gcd(int a,int b) //结合辗转相除法思想分析递归过程 { if(b==0) //跳出while(b!=0)循环后,a的值即为所求的最大公约数 return a; else //未跳出循环时,把b的值作为下一次递归时a的值,a%b的值作为下一次递归时b的值 return gcd(b,a%b); }int main(){ int m,n; while(scanf("%d %d",&m,&n)!=EOF) printf("%d/n",gcd(m,n)); return 0; }程序截图:
5. 逆序输出一个正整数n的各位数字
源代码:
#include <stdio.h>void fun(int n){ if(n) { printf("%d",n%10); fun(n/10); }}int main(){ int n; while(scanf("%d",&n)!=EOF) { fun(n); printf("/n"); } return 0; }程序截图:
6. 将一个10进制正整数转换为m进制数(2<=m<10)
源代码:
#include <stdio.h>void fun(int n,int m){ if(n>0) { fun(n/m,m); printf("%d",n%m); }}int main(){ int n,m; while(scanf("%d %d",&n,&m)!=EOF) { fun(n,m); printf("/n"); } return 0; }程序截图:
附各题思路分析及要点整理:
新闻热点
疑难解答