为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
慕粉4024641 2016-09-23 19:55:16
#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里面?如果不是存在哪里
查看完整描述

2 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

这就是“递归”。

最后的结果其实就是从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


如果还是不懂,就再写出来具体哪里不明白。

查看完整回答
反对 回复 2016-09-23
?
全_无_修

TA贡献11条经验 获得超6个赞

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

查看完整回答
反对 回复 2016-09-26
  • 2 回答
  • 1 关注
  • 1449 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信