• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

国内首家协议开发

软芯音视解码保护平台

在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

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

#include
/* 定义获开单词数量的函数 */
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里面?如果不是存在哪里

免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。

版权声明:作者保留权利,不代表天盟立场。

使用道具 举报

全部参与2

这就是“递归”。
最后的结果其实就是从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}; 前面加了两对小括号,后面加了一对中括号和一对大括号,后面加的“不合法的括号种类”是为了容易理解。不知道这样对你有没有什么提示性的帮助。

使用道具 举报

发新帖

发布任务需求已有1031289位用户正在使用天盟网服务

发布分类: *
任务预算: *
需求内容: *
手机号码: *
任务商家报价为
  • 预算价 :
  • 成交价 :
  • 完工期 :
  • 质保期 :

* 最终任务项目以服务商报价、双方协商为准!