算法:递归(1)

递归是一种重要的算法,要想用递归做题目,自然要先理解它的原理,下面是几个有关递归的题目,希望能对你有点启示。

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;
}

  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值