首页 > 学院 > 开发设计 > 正文

蓝桥杯——递归一:概念及简单递归问题(2017.2.19)

2019-11-08 02:15:34
字体:
来源:转载
供稿:网友

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;  }程序截图:

附各题思路分析及要点整理:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表