递归函数--猴子摘桃问题的解题思路

猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又多吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天在想吃的时候就剩一个桃子了,问第一天共摘下来多少个桃子?并反向打印每天所剩桃子数。

解题思路:
反向推算
第十天桃子数:1
第九天桃子数:(1+1)x2=4
第八天桃子数:(4+1)x2=10
第七天桃子数:(10+1)x2=22

第一天桃子数:(第二天桃子总数+1)x2

有了规律就简单多了,整理一下题中变量:分别是天数(n)、所剩桃子数(num),根据规律,编写代码如下:
递归函数--猴子摘桃问题的解题思路_第1张图片
执行结果:
第9天所剩桃子4个
第8天所剩桃子10个
第7天所剩桃子22个
第6天所剩桃子46个
第5天所剩桃子94个
第4天所剩桃子190个
第3天所剩桃子382个
第2天所剩桃子766个
第1天所剩桃子1534个
猴子第一天摘了:1534个桃子。

代码:

#include 
int getPeachNumber(n)
{
    int num;    
    if(n==10)
    {
       num=1; 
       return 1;
    } 
    else
    {
        num=(getPeachNumber(n+1)+1)*2;   
        printf("第%d天所剩桃子%d个\n",n,num); 
    }
    return num;
}
int main()
{
    int num=getPeachNumber(1);
    printf("猴子第一天摘了:%d个桃子。\n", num);
    return 0;
}

递归函数特点:

1、每一级函数调用时都有自己的变量,但是函数代码并不会得到复制,如计算5的阶乘时每递推一次变量都不同;
2、每次调用都会有一次返回,如计算5的阶乘时每递推一次都返回进行下一次;
3、递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序;
4、递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反;
5、递归函数中必须有终止语句。
一句话总结递归:自我调用且有完成状态。

你可能感兴趣的:(C语言基础)