重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
首先要理解递归的概念,先递后归
创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、网站制作、济南网络推广、小程序开发、济南网络营销、济南企业策划、济南品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供济南建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
开始递
get(1) n=1不成立,执行else
get(2) n=2不成立,执行else
get(3) n=3不成立,执行else
get(4) n=4不成立,执行else
get(5) n=5不成立,执行else
get(6) n=6不成立, 执行else
get(7) n=7不成立, 执行else
get(8) n=8不成立, 执行else
get(9) n=9不成立 执行else
get(10) n=10成立,返回值1
开始归!
get(10) num=1
get(9) get(n+1)*2+2 = 1*2+2=4 //这里说下为什么不在递的时候计算else呢?因为在递的时候我们并不知道他们上一次的值,所以是没办法计算的,这里get(n+1)已经知道了上一次的值get(10)是1。
get(8) get(n+1)*2+2 = 4*2+2 =10
get(7) get(n+1)*2+2 = 10*2+2 = 22
get(6) get(n+1)*2+2 = 22*2+2 = 46
get(5) get(n+1)*2+2 = 46*2+2 = 94
get(4) get(n+1)*2+2 = 94*2+2 = 190
get(3) get(n+1)*2+2 = 190*2+2 = 382
get(2) get(n+1)*2+2 = 382*2+2 = 766
get(1) get(n+1)*2+2 = 766*2+2 = 1534
至此递归条件结束
先看看下面的例子:
void fun(int i)
{
if (i0)
{
fun(i/2);
}
printf("%d\n",i);
}
intmain()
{
fun(10);
return 0;
} 展开后如下:好理解了吧void fun(int i)
{
if (i0)
{
//fun(i/2);
if(i/20)
{
if(i/40)
{
…
}
printf("%d\n",i/4);
}
printf("%d\n",i/2);
}
printf("%d\n",i);
}
这样一展开,是不是清晰多了
调用过程就是自己调用自己,直到满足退出条件,这个很重要
比如要求5的阶乘,先要求4的阶乘,接着求3的阶乘,。。。最后当n=1时,直接return 1
也就结束了递归。其实很好理解的。。
递归函数有三点要求:
1,递归的终止点,即递归函数的出口
2,不断的递归调用自身
3,递归函数主体内容,即递归函数需要做的事情
ps:3一般可以放在2的前面或者后面,一般1放最前面。另外,2和3可以根据不同的需要合并,比如,有时候递归函数的主体就是返回调用下层函数所得到的结果。
具体例子如下:
void fun(int n)
{
if(n=0) return; //1 这是递归的终点,即出口
fun(n-1); //2、递归函数自身的调用
coutnendl; //3 递归函数的主体内容
}
2,3合并的情况
int fun(int n)
{
if(n=0) return 0;
return fun(n-1)+fun(n-2); //2 3合并
}
直接或间接调用自已的函数就是递归函数,否则为非递归函数。如:
unsigned fun(unsigned x){
if(x==1 || x==0)
return 1;
return x*fun(x-1);
}
这个函数的体中出现了调用自己的语句fun(x-1);,所以是递归函数。