C/C++之内联函数与递归函数

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
    
  • 分析:递归函数一直进入新的层,满足条件后从最后调用的层那里开始一层一层结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值