为什么 输出的是充第九天开始输出的?还有那个 ‘n ’ 我不能理解

来源:5-8 递归函数(二)

取消不了

2016-08-24 10:19

#include <stdio.h>

int getPeachNumber( int n)

{

    int num;    //定义所剩桃子数

    if(n==10)

    {

       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;

}

中的  “ n ”实在是不知道为啥从第九天开始输出的

写回答 关注

5回答

  • 慕粉3861168
    2016-08-24 16:05:54
    已采纳

    你知道第十天的,当然最先算出的就是第九天的个数,递归就是逆推来计算的

    取消不了

    非常感谢!

    2016-10-21 20:17:07

    共 1 条回复 >

  • 帅的一匹的小黑马
    2016-10-05 12:16:48

    我先把  getPeachNumbe 简写成 gN。这个n是天数的意思。

    首先 它给了我们 int num = getPeachNumber(1);

    gN(1);中n=1代入 (getPeachNumber(n+1)+1)*2;

    就会有  (gN(1+1)+1)*2      这时gN(1+1)=gN(2)对吧?可是gN(2)等于多少我们又不知道,所以重新代入  (getPeachNumber(n+1)+1)*2;   就会出现  (gN(2+1)+1)*2 ,这时又出现了 gN(3) 我们还是不知道,就继续.....(以此类推) 到后面就有当 n==10时 return=1 就是说gN(10)=1 。这时g(10)等于多少我们知道,就代入gN(9)的式子里面得出桃子数,然后算上去。因为最先得出第九天的桃子所以程序先输出。

      n=1时 (gN(1+1)+1)*2   ——》里面gN(2)的值不知道

      n=2     (gN(2+1)+1)*2 ——》gN(3)的值不知道

        n=3  (gN(3+1)+1)*2 ——》gN(4)不知道

         n=4 (gN(4+1)+1)*2 ——》gN(5)不知道

        n=5  (gN(5+1)+1)*2 ——》gN(6)不知道

          n=6(gN(6+1)+1)*2 ——》gN(7)不知道

          n=7(gN(7+1)+1)*2 ——》gN(8)不知道

         n=8 (gN(8+1)+1)*2 ——》gN(9)不知道

          n=9(gN(9+1)+1)*2 ——》gN(10) 知道

              n==10  则 return 1;所以gN(10)=1.

           现在开始往回带,因为gN(10)=1代入gN(9)能登出gN(9)等于多少,接着就gN(8) 推上去.....

           n=9   (gN(9+1)+1)*2 ——》gN(9)  = (1+1)*2=4   因为已经得出来了这里就先输出第九天的桃子数了。

          n=8    (gN(8+1)+1)*2 ——》gN(8)  = (4+1)*2=10

                                          。。。。推下出。

           打的好累,但希望能帮到你 :)

  • 慕后端9788028
    2016-09-04 17:01:38

    { 【((g(10)+1)*2+1】*2+1)*2.........+1    }*2    来分析这个式子   注意这句话  每一次进行一次  +1*2就代表递归了一次  将g(1)进行递归后展开得到的就是这个式子     如果想的不明白就倒着想   第10天苹果是1个   第九天是(1+1)*4=4  。    如果递归没有完成  是不会进行计算打印的 。当开始计算时 是先计算最里面的式子,而g(10)+1)*2   对应着g(9)   就是第九天。这就是我的浅见,如有不恰当之处  还请斧正

  • 听羽
    2016-08-24 22:38:53

    当n=10,满足if(n==10),所以直接return 1了,程序并不会走else里面的内容。n=1时,没有满足递归结束的条件,n会一直递增下去,直到n=10,所以n=1时并不会执行下面的printf()打印语句,而是继续执行下去。当执行到n=10会逆推回去,由于if(n==10)里面的代码块是没有printf()打印语句的,所以从9开始打印,不过你也可以加上去,然后就可以看到第十天的效果了

  • 紊亠亠3730601
    2016-08-24 16:24:23

    应该是你的if else使用不当

C语言入门

C语言入门视频教程,带你进入编程世界的必修课-C语言

926021 学习 · 20793 问题

查看课程

相似问题