回调函数(钩子函数) 内联函数 递归函数

本文详细介绍了回调函数的概念、如何在函数B中使用回调函数say,以及内联函数的特性、何时使用及注意事项。还探讨了递归函数的概念,包括递归的基本原理和递归解决阶乘和幂运算的例子。
摘要由CSDN通过智能技术生成

1。回调函数

概念:

函数实现方不调用该函数,而由函数接口提供方间接调用的函数,称为回调函数。

函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。

function say (value)

{
    alert(value);
}
function execute (someFunction, value)

{
    someFunction(value);
}
execute(say, 'hi js.'); // say就是回调函数

冒泡回调运用

2。内联函数inlin

  • 内联的特性 :以空间换时间

  • 当编译器发现某段代码有inline关键字的时候就会将这段代码插入到当前的位置,加快运行效率,但是也会消耗一定的运行空间

  • 什么时候用inline

    1. 函数需要频繁被调用,代码最好不要超过5行

  • inline注意事项

    • 内联函数在头文件实现,其它函数不要在头文件实现

    • 函数声明和函数实现都需要添加关键字inline,如果函数声明没有添加extern 和 inline 关键字,会报错

原理

1)当我们调用内联函数时,不会像调用普通函数那样额外开销,而是把内联函数的代码直接嵌入到调用它的地方去,但仍然保持其独立性。

2)如果一个函数为内联函数,它就不会出现在最终的可执行代码里,只是会存在于编译器中,在编译器需要的地方插入

                    //inline.h
#ifndef _ADD_H
#define _ADD_H

#include<stdio.h>

//内联函数需要extern声明,并加上inline关键字
extern inline int add(int a,int b);

// 只有内联函数需要在头文件实现
// 其它函数只能在头文件声明,不能实现
inline int add(int a,int b)
{
    return a+b;
}

#endif



                    //main.c
#include"inline.h"


int main(int argc, char const *argv[])
{
    printf("%d\n",add(10,20));
    return 0;
}

3.递归函数

递归概念:如果一个函数内部,包含了对自身的调用,则该函数称为递归函数。

自己调用自己,注意需要有结束条件,否则会出现内存溢出(段错误)
    什么时候用到递归  : 需要满足有规律递减条件,递减到某个程度是可以退出的
    func()
    {
        func()
    }

例子:
#include<stdio.h>

void func(int n)
{

    //递归退出条件
    if(n == 5)
        return;

    //func(++n);//5,4,3,2
   // printf("%d\n",n);
    //func(++n);//1,2,3,4


    func(++n);
    printf("%d\n",--n);//4,3,2,1
}

int main(int argc, char const *argv[])
{
    int n = 1;
    func(n);
    return 0;
}

 阶乘
#include<stdio.h>

int func(int n)
{
    //退出条件
    if(n == 1)
        return 1;
    return func(n - 1)*n;
}

int main(int argc, char const *argv[])
{
    int n = func(4);
    printf("%d\n",n);
    return 0;
}
幂运算
#include<stdio.h>

float myPower(float base, int exp)
{
    // 退出条件
    if(exp == 0)
        return 1;
    return myPower(base,exp-1)*base;
}

int main(int argc, char const *argv[])
{
    float base;// 底数
    int exp; // 指数

    printf("请输入底数和幂指数(2^3)表示2的3次方: ");
    int ret = scanf("%f^%d",&base,&exp);
    if(ret != 2)
    {
        printf("请重新输入\n");
        while(getchar() != '\n');
        return -1;
    }
    // 1. 0^0没有意义
    if(base == 0 && exp == 0)
    {
        printf("0^0没有意义\n");
    }
    // 2. n^0==1
    else if(base != 0 && exp == 0)
    {
        printf("n^0次方等于1\n");
    }
    // 3. 0^n== 0
    else if(base == 0 && exp != 0)
    {
        printf("0^n次方等于0\n");
    }
    // 4. 正幂指数
    else if(exp > 0)
    {
        printf("%.2f^%d = %f\n",base,exp,myPower(base,exp));
    }
    else //5.负幂指数
    {
        printf("%.2f^%d = %f\n",base,exp,1/myPower(base,-exp));
    }
    return 0;
}
幂运算(非递归)
#include<stdio.h>

float myPower(float base, int exp)
{
    float temp = base;
    for(int i = 1; i < exp; i++)
    {
        base *= temp;
    }
    return base;
}

int main(int argc, char const *argv[])
{
    float base;// 底数
    int exp; // 指数

    printf("请输入底数和幂指数(2^3)表示2的3次方: ");
    int ret = scanf("%f^%d",&base,&exp);
    if(ret != 2)
    {
        printf("请重新输入\n");
        while(getchar() != '\n');
        return -1;
    }
    // 1. 0^0没有意义
    if(base == 0 && exp == 0)
    {
        printf("0^0没有意义\n");
    }
    // 2. n^0==1
    else if(base != 0 && exp == 0)
    {
        printf("n^0次方等于1\n");
    }
    // 3. 0^n== 0
    else if(base == 0 && exp != 0)
    {
        printf("0^n次方等于0\n");
    }
    // 4. 正幂指数
    else if(exp > 0)
    {
        printf("%.2f^%d = %f\n",base,exp,myPower(base,exp));
    }
    else //5.负幂指数
    {
        printf("%.2f^%d = %f\n",base,exp,1/myPower(base,-exp));
    }
    return 0;
}

要点:

  • 只有能被表达为递归的问题,才能用递归函数解决

  • 递归函数必须有一个可直接退出的条件,否则会无限递归

  • 递归函数包含两个过程,一个逐渐递进的过程,和一个逐渐回归的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值