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
-
函数需要频繁被调用,代码最好不要超过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;
}
要点:
-
只有能被表达为递归的问题,才能用递归函数解决
-
递归函数必须有一个可直接退出的条件,否则会无限递归
-
递归函数包含两个过程,一个逐渐递进的过程,和一个逐渐回归的过程。