猿问

return getWordNumber( n - 1 ) +n;是怎么工作的

#include <stdio.h>

/* 定义获取单词数量的函数 */

int getWordNumber(int n)

{   

    printf("%d\n",n);

    if(n == 1) 

    {

        return 1;    //第一天只会1个单词

    }

    else{

        return getWordNumber( n - 1 ) +n;       //到第天会的单词数量

    }

}


int main()

{

    int num = getWordNumber(10);     //获取会了的单词数量

    printf("小明第10天记了:%d个单词。\n", num);

    return 0;

}

 return getWordNumber( n - 1 ) +n; 这是怎么出现55的   我写的 printf("%d\n",n);会输出10,9,8,7,6,5,4,3,2,1    怎么看都搞不清工作流程  难道那个55不是存在n里面?如果不是存在哪里

慕粉4024641
浏览 1451回答 2
2回答

onemoo

这就是“递归”。最后的结果其实就是从1加到10,所以结果是55。getWordNumber函数中的printf("%d\n",n)打印的就是每次调用传入的参数,确实会依次输出10,9,8,7,6,5,4,3,2,1,这也没错啊。55当然不是存在n里面,最终从getWordNumber(10)返回的值是55,被保存到num中。也许你没理解递归的执行流程:递归函数中首先规定一个递归截止条件,这个代码中就是if(n == 1) ,随后再次调用自己(当然是传入不同的参数)。重点是:这里再次调用自己时,程序执行流程进入到另一个getWordNumber函数中,但前次调用的getWordNumber函数是没有结束的,只是暂停在return getWordNumber( n - 1 ) +n;语句那里,等待getWordNumber( n - 1 )返回。这样不断调用自己,直到某次调用时传入的参数 n 就是 1 ——遇到了递归截止条件,于是函数返回 1 到上一次调用中,这个“上一次调用”的函数原本是暂停在 return getWordNumber( n - 1 ) +n; 这里,这样 getWordNumber( n - 1 ) 就是函数返回值(也就是1),所以就返回了 1 + n,同样是返回到上级调用中...... 这样这一串调用一直返回到最初的getWordNumber函数中,最终返回的结果就等于是之前所有结果的和。我在老问答区有一个回答,里面举了一个具体的例子,虽然不是关于这个代码的,但含义是完全一样的,你可以参考:http://www.imooc.com/qadetail/90499 如果还是不懂,就再写出来具体哪里不明白。

全_无_修

return ((getWordNumber( n - 1 ) )+n); ------>>return {[getWordNumber( n - 1 ) ]+n}; 前面加了两对小括号,后面加了一对中括号和一对大括号,后面加的“不合法的括号种类”是为了容易理解。不知道这样对你有没有什么提示性的帮助。
随时随地看视频慕课网APP
我要回答