递归函数

递归给人的感觉总是很高大上,个人感觉再多的理论知识都不如一个完美的例子,不喜勿喷。

网上看到一个题目:有一堆桃子,猴子每天吃一半后再多吃一个,到第5天时剩余一个桃子,求第一天的个数。

前一天 = ( 后一天 + 1 ) * 2;  

例如:第4天 = ( 第5天 + 1 ) * 2 = ( 1 + 1) * 2 = 4;

代码如下:

 

/************************************************************* 
有一堆桃子,猴子每天吃一半后再多吃一个,到第5天时剩余一个桃子 
*************************************************************/  
  
#include <stdio.h>  
  
int recursion(int day)  
{  
    int total;  
  
    if (day == 5)  
    {  
        return 1;  
    }  
    else if (day < 5)  
    {  
        day++;  
        total = (recursion(day) + 1) * 2;  
        return total;  
    }  
}  
  
int main(void)  
{  
    int i;  
  
    for (i=1;i<=5;i++)  
        printf("第%d天有%d个桃子\n", i, recursion(i));  
  
    return 0;  
}  

运行结果:

第1天有46个桃子
第2天有22个桃子
第3天有10个桃子
第4天有4个桃子
第5天有1个桃子
请按任意键继续. . .


下面开始逐步讲解高大上的递归:

 

recursion(1)

进入int recursion(int day)函数

day = 1; day < 5; day++; day = 2; total = ( recursion(2) + 1 ) * 2;      //第1天桃子个数未知  
day = 2; day < 5; day++; day = 3; total = ( recursion(3) + 1 ) * 2;      //第2天桃子个数未知  
day = 3; day < 5; day++; day = 4; total = ( recursion(4) + 1 ) * 2;      //第3天桃子个数未知  
day = 4; day < 5; day++; day = 5; total = ( recursion(5) + 1 ) * 2;      //第4天桃子个数未知  
day = 5; day == 5; return 1;                                             //第5天桃子个数为1(已知)  
recursion(5) = 1;  total = ( recursion(5) + 1 ) * 2 = 4;  return total ; //第4天桃子个数为4  
recursion(4) = 4;  total = ( recursion(4) + 1 ) * 2 = 10; return total ; //第3天桃子个数为10  
recursion(3) = 10; total = ( recursion(3) + 1 ) * 2 = 22; return total ; //第2天桃子个数为22  
recursion(2) = 22; total = ( recursion(2) + 1 ) * 2 = 46; return total ; //第1天桃子个数为46
posted @ 2017-10-30 15:49  LeeAaron  阅读(194)  评论(0编辑  收藏  举报