递归调用(对内存的消耗是极大的)
概念:
一个函数在它的函数体内,调用它自身称为递归调用,这种函数叫做递归函数
注意:
- C语言的函数中,支持运行时堆栈对递归函数的调用
- 在 递归调用的时候,主调函数又是被调函数,执行调用的过程就是其反复调用自己的过程,每一次调用就会进入新的一层,在前一篇博客中我们提到过,函数栈,那么递归调用在调用自己的过程中,同样也是会不断开辟函数栈;
3.递归调用在调用自身进入下一层的时候,因为上一层占用的栈空间其实是没有进行释放掉的,因此过多层次的递归的话,有可能会导致内存溢出的现象
递归调用的特性:
- 递归调用必须存在一定 的限制条件,当达到条件的时候,递归调用将不再继续执行
- 每次调用之后,其最终的结果都是会接近该限制条件
应用:
文件夹 的遍历删除
求一个数的阶乘等
下面通过一个例子演示一下最简单的递归调用:
#include<stdio.h>
/**
* 猆波那契数,后面的数值是前面两个数的和,
* 阶乘
*/
long fabonacci_1(int num1);
long factorial_1(int num2);
int main(int argc,char * argv[]){
int num = 10;
int i = 1;
for(; i<= num;i++){
printf("element:%ld\n",fabonacci_1(i));
}
printf("factorial:%ld\n",factorial_1(num));
return 0;
}
long fabonacci_1(int num1){
if(num1 <= 2)
return 1;
return fabonacci_1(num1-1) +fabonacci_1(num1 - 2);
}
long factorial_1(int num2){
if(num2 <= 0){
return 1;
}else{
return num2 * factorial_1(num2 - 1);
}
}
对应的结果为:
element:1
element:1
element:2
element:3
element:5
element:8
element:13
element:21
element:34
element:55
factorial:3628800
其实在我们掳代码的时候,很多情况下都是需要用到迭代的。这一块的认识,对于我们降低代码量有大大的提高。