文章目录
前言
日常咱们看待问题都是从始至终,顺序思考的,递归的思想就是反过来的,从结果回溯,一直到开始。找到递归关系和结束条件,非常关键。
引例一、求阶乘
问题描述
自然数n的阶乘就是从1开始到n的连续相乘结果。
代码及分析
#include<stdio.h>
int fact(int n)
{
if(n<=1)
return 1;
else
return n*fact(n-1);
}
int main()
{
int i;
printf("请输入要计算阶乘的数:");
scanf("%d",&i);
printf("%d的阶乘结果为%d\n",i,fact(i));
return 0;
}
根据阶乘的数学定义,1的阶乘是他本身,将求阶乘功能写成一个函数的形式,通过自身调用的方式实现求大于1的数的阶乘(该代码涉及的问题是:设置的结果为int型,表示范围有限制)
引例二、进制转换
问题描述
将十进制数转换为R进制数的思想是除以R,直到得到的结果小于R。
代码及分析
#include<stdio.h>
#include<string.h>
void conv2(char *s,int n,int b)
{
char bit[]={"0123456789ABCDEF"};
int len;
if(n==0)
{
strcpy(s,"");
return;
}
conv2(s,n/b,b);
len=strlen(s);
s[len]=bit[n%b];
s[len+1]='\0';
}
int main()
{
char s[80];
int i,base,old;//old为待转换的十进制数
printf("请输入十进制数:");
scanf("%d",&old);
printf("请输入待转换的进制(阿拉伯数字):");
scanf("%d",&base);
conv2(s,old,base);
printf("%s\n",s);
return 0;
}
和上个例子阶乘类似,都是通过自身调用来实现的,值得注意的是:
- 进制转换后,由于表示的数,十六进制中A表示十进制中的10,因此输出写为了一个字符串数组的形式;
- 预先设置了该数组的大小为80,且进制转换后的数组里共16个字符,因此可转换进制最大为十六进制,能表示的最大数值为十六进制下的16^80-1,明显,该值远超int型表示范畴。
引例三、n层台阶,每次上k步问题
引例三.1 抢20游戏必胜攻略
引例三.2 20层台阶,每次可跨1、2步
设F(n)代表上到第n层,则上到第20层时,上一次可能在的楼层有两种情况:18层、19层(因为一次1、2步),也就是F(20) = F(18) + F(19),同理,有递归关系F(n) = F(n-1) + F(n-2)。
不难看出,结束条件:F(1) = 1,F(2) = 2
引例三.3 n层台阶,每次k步
到第n层的时候,上一次可能在的楼层就有k种情况:n-1、n-2、n-3。。。n-k层。
递归关系就是F(n) = F(n-1) + F(n-2)+。。。+F(n-k)
结束条件也相应有k个。
可以利用排列组合的思想,来求F(i),1 <= i <= k。