递归何解
昨天面试,遇到一个 1+2+3+4+....+100 求和.用递归函数来表示.
一开始学C的时候对递归也只了解个大概,从来没用过(以为用处不大). 所以,我被PASS掉了.(这么简单的都不会,要你何用?)
伤心归伤心,谁叫自己学的太少了. 现在来补补.
在C Primer 第九章 有讲到递归,里面有这样一个例子...
#include <stdio.h>
void up_and_down(int n)
{
printf("level is %d: n location %p\n",n,&n);
if(n<4)
up_and_down(n+1);
printf("Level %d:n location %p\n",n,&n);
}
int main(int argc, char* argv[])
{
up_and_down(1);
return 0;
}
本人愚钝.所以在思考时,没想通为什么 多输出 3次 Level %d:n location %p\n 这样的语句. 于是就百度了.发现不明白,也不止我一个.(还好不止我一个,不然就没有现成的答案了)
看了解释后,发现还是有点不明白,(真的是愚钝啊.) 灵光一闪. 呃 ,递归. 忽然发现,原来秘密都藏在 递归这个词中.为什么会'多输出3次'了. 因为有了递增,在没有满足递增的条件下,
最后得回归回去....这样的解释适合我. 真正的解释,在书中和网上都有详细的说明.参考如下:
1 每一次函数调用都会有一次返回(返回到它的调用函数,直至回到主函数).当程序流执行到某一级递归的结尾处(最后一级的递归完全结束,它的工作栈已经被撤消)时,它会转移到前一级递归继续执行.
2 递归函数中,位于递归调用前的语句和各级被调函数具有相同的顺序.如打印语句【1】位于递归调用语句前,它按照递归调用的顺序被执行了 4 次.
3 每一级的函数调用都有自己的私有变量.(其实每个栈都保留了被调函数的参数,和调用函数的返回地址等)
4 递归函数中,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反.
5 虽然每一级递归有自己的变量,但是函数代码并不会得到复制.
6 递归函数中必须包含可以终止递归调用的语句.
7 对于初学递归,可通过设置断点,调试运行,观察数据,弄清楚程序的具体执行流程,有利于在感性上了解递归,从而更深入的思考.
8 其实对于递归调用,完全可以把对函数自身的调用,看成是它对其它函数的调用(只是执行的功能相同).
9 递归使用的情形是问题规模减小了,但是问题还是那个问题.比如说求n!,它等于n乘上(n-1)!,这就是问题出现重复;再比如对求一棵二叉树的深度,求其左子树的深度,但其左子树的子树仍然是一棵二叉树,这也是问题简化后,仍是对同样的问题求解.
10 学习用递归树来表示递归函数的调用过程.
相信聪明的你,也应该懂了吧.
至于1+2+3+4+......+100
int Add(int a)
{
if(a == 1)
return 1;
else
return n+Add(a-1);
}