C/C++之内联函数与递归函数
上节我们介绍了栈空间的溢出。C/C++之函数的栈空间
本节我们介绍另外两种函数。
1、内联函数
-
特点,比别的函数调用快!
-
普通函数的缺点:
每调用一次函数,就会为这个函数分配一个“栈”
在计算机地层做很多工作(保存原来的执行环境,切换到新的执行环境),有一定时间的"开销"; -
解决方案: 使用内联函数
-
内联函数:(优点)
当编译器在编译时,如果遇到内联函数,就会直接将整个函数体的代码插入“调用处“
相当于内联函数的函数体在调用处被重写了一次,避免调用的"开销",节省时间。
(缺点)
使调用内联函数的程序变得 ”臃肿“,消耗调用函数的"栈空间"。 -
使用: 需要在函数返回类型前面加上inline
-
例子:
#include <iostream> using namespace std; inline int add(int x, int y){ return x + y; } int main(){ //相当于直接替换成cout << 3 + 5 << endl; cout << add(3 + 5) << endl; return 0; }
-
建议: 只有特别简单的函数才使用内联函数!
2、递归函数
-
定义: 在函数的内部,直接或者间接的调用自己。
-
注意: 在使用递归函数内部,一定要确定一个”结束条件“
-
使用场景: 一般在处理一些特别复杂的问题,难以直接解决。(例如:快速傅里叶变化FFT)。
可以将复杂问题简单化。 -
经典实例:
- 斐波那契数列
- 汉诺塔问题
-
例子: 斐波那契数列1, 1, 2, 3, 5, 8, 13, 21, ……, 计算第n个数是多少
分析:f(n) = f(n-1) + f(n - 2); f(1) = 1, f(2) = 1;
代码实现:#include <iostream> using namespace std; int fib(int n){ if(n == 1 || n == 2){ return 1; } if(n > 2) return fib(n - 1) + fib(n - 2); } int main(){ int n = 8; cout << "第" << n << "个斐波那契数列值为" << fib(n) << endl; return 0; }
输出结果:
第8个斐波那契数列值为21
缺点: n的值很大的时候会溢出!而且耗时比较高。
-
调用过程:
#include <iostream> using namespace std; void test(int n){ if(n > 5) return; cout << "调用第"<< n << "层test" << endl; test(n + 1); cout << "结束第"<< n << "层test" << endl; } int main(){ test(1); return 0; }
输出结果:
调用第1层test 调用第2层test 调用第3层test 调用第4层test 调用第5层test 结束第5层test 结束第4层test 结束第3层test 结束第2层test 结束第1层test
-
分析:递归函数一直进入新的层,满足条件后从最后调用的层那里开始一层一层结束。