啥是递归?
即是该函数调用它本身自己,这种调用过程称为递归。
递归可以相当于循环,所以想结束递归,就必须有终止递归的条件测试部分,否则就会出现无限递归(即无限循环)。同时,这也是使用递归的难点。
案例
#include <stdio.h> void recur(int); int main (void) { recur(1); return 0; } void recur(int n) //递归函数 { printf("第%d级调用\n", n); //#1 if (n < 4) { recur(n+1); //递归 } printf("第%d级返回\n", n); //#2 }
- 输出结果:
第1级调用第2级调用第3级调用第4级调用第4级返回第3级返回第2级返回第1级返回
- 解析:
- 从结果可以看出,#1和#2相当于循环体,当符合测试条件(即n<4)时,#1部分循环;当测试条件为false时,#2部分循环。
- 在递归函数中,位于递归调用之前的语句(即#1部分),按被调函数(即recur())的顺序执行;位于递归调用之后的语句(即#2部分),按被调函数相反的顺序执行。
- 每级函数调用都有自己的变量,递归调用就相当于又从头开始执行函数的代码。
- 每次函数调用都会返回一次,并且按顺序逐级返回递归。
递归(优缺点)与循环
- 使用循环的地方都可以使用递归
- 缺点:
- 递归快速耗内存
- 不方便阅读和维护
- 效率低
- 优点:
- 简洁
- 适合解决阶乘、涉及相反顺序的编程问题
尾递归
正好在return语句之前。尾递归是最简单的递归形式,因为它相当于循环。
从递归函数中,可以隐约的知道所有的C函数皆平等,即是你可以调用我,我可以调用你。
PS:这是Xzhi本人第一次写博客,写博客的目的是与他人分享自己学习的心得,同时是对学习的总结与记录,此文章中若存在bug,欢迎大神们指正。