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里面?如果不是存在哪里 |
免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。
版权声明:作者保留权利,不代表天盟立场。
|
|
|
|
这就是“递归”。
最后的结果其实就是从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}; 前面加了两对小括号,后面加了一对中括号和一对大括号,后面加的“不合法的括号种类”是为了容易理解。不知道这样对你有没有什么提示性的帮助。 |
|
|
|
|