递归是一种重要的算法,要想用递归做题目,自然要先理解它的原理,下面是几个有关递归的题目,希望能对你有点启示。
1.求最大公约数和最小公倍数(辗转相除法)
方法简介
要求最大公约数可以运用好几种计算方法,而这里我们用辗转相除法
辗转相除法:用较大数除以较小数,再用余数去除除数,直到最后余数为0
而最小公倍数等于两个数相乘再除以最大公倍数
题目描述
输入两个正整数m和n,求其最大公约数和最小公倍数。
输入
输入两个正整数m和n,用空格隔开。
输出
分别输出m和n的最大公约数和最小公倍数,用空格隔开。
请注意行尾输出换行。
样例输入
15 9
样例输出
3 45
源代码
#include<stdio.h>
int GCD(int a,int b)
{
int max,min;
max=a>b?a:b;
min=a<b?a:b;//求最大值和最小值用三目运算符比较简便一点
if(max%min==0)
{
return min;
}
else//辗转相除法核心
{
return GCD(min,max%min);
}
}
int main()
{
int m,n;
scanf("%d %d",&m,&n);
int l;
l=GCD(m,n);
printf("%d %d",l,(m*n)/l);
return 0;
}
2.猴子吃桃
这个问题比较简单,主要是想到倒推
题目描述
猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早晨又将剩下的桃子吃掉一半,又多吃了一个。以后每天早晨都吃了前一天剩下的一半零一个。到第n天早晨想再吃时,就只剩下一个桃子了。求第一天共摘了多少个桃子。
输入
一个正整数n。
输出
输出第一天共摘了多少个桃子。
请注意行尾输出换行。
样例输入
10
样例输出
1534
源代码
#include<stdio.h>
int add(int b)
{
if(b==1)
{
return 1;//第一天的话,自然只有1个桃子
}
else
return 2*(add(b-1)+1);//根据题目的表达设立
}
int main()
{
int n;
scanf("%d",&n);
int m;
m=add(n);
printf("%d",m);
return 0;
}
3.进制转换
这里讲的是将十进制的数转换为任意进制的数,如果想去求转换16进制,只需要额外一个条件,也就是将数字10~16转换为相应字母A~F
方法
1.用该数除以进制的数,得到商和余数
2.再商除以进制数,得到新的商和余数
3.重复步骤1和2,直到商为1
4.倒着出余数
递归算法将一个十进制数X转换成任意进制数M(M<=16)。
输入
一行,整数X和M,X<=10^9,M<=16。
输出
十进制数X的M进制数。
样例输入
11 2
样例输出
1011
源代码
#include<stdio.h>
void add(int a,int b)
{
if(a==0||a==1)
{
printf("%d",a);
}
else
{
add(a/b,b);//因为要倒序输出,所以在调用函数之后执行
if(b==16)//对于16进制额外处理
{
switch(a%b)
{
case 15:putchar('F');break;
case 14:putchar('E');break;
case 13:putchar('D');break;
case 12:putchar('C');break;
case 11:putchar('B');break;
case 10:putchar('A');break;
default:printf("%d",a%b);
}
}
else
printf("%d",a%b);
}
}
int main()
{
int n;
scanf("%d",&n);
int m;
scanf("%d",&m);
add(n,m);
return 0;
}