不知道大家有没有和小陈一样的想法,明明理解了递归的算法,可是当面对一道用递归来完成的题目时,却往往难以下手,这是我们的修为不够导致的,那么今天,小陈就由浅入深地为您详解一道递归小题,希望能帮到您!
对于递归,我觉得很重要的第一个事就是,这个函数的功能是什么,而这个,是完全由你自己来定义的。 所谓递归,就是会在函数内部代码中,调用这个函数本身,那么就引出了第二件重要的事情,我们必须要找出递归的结束条件,不然的话,会一直调用自己,进入无底洞。也就是说,我们需要找出当参数为啥时,递归结束,之后直接把结果返回,
使用递归计算函数Ack(m,n),公式如下:
函数接口
函数名:Ack 参 数:整型变量 m,n 返回值:整型 Ack 的值
输入
输入 2 个整数 m,n 。
输出
输出Ack的计算结果,格式为 "Ack(m,n)=X" 。
测试说明
测试用例
输入:
3 4
输出:Ack(3,4) = 125
主函数部分如下。
#include<stdio.h>
int main()
{
int m,n;
scanf("%d%d",&m,&n);
ack(m,n);
printf("Ack(%d,%d) = %d",m,n,ack(m,n));
return 0;
}
接下来要做的是用递归补全ack函数。
ack函数除了m=0时一直在不断调用自身,函数的出口,也就是递归调用的尽头,我们发现,只有当m=0时函数内没有调用ack函数,所以我们可以直接将它作为出口。
int ack(int m,int n)
{
int k;
if(m==0)
{
k=n+1;
}
else if(n==0&&m>0)
{
k=ack(m-1,1);
}
else{
k=ack(m-1,ack(m,n-1));
}
return k;
}
分情况列出之后将k值返回即可。
希望能为大家带来帮助!
最后,如果您觉得我的文章写的不错。
请给小陈:
点赞,收藏加关注!我一定会带来更好的文章的!