函数

基本概念

 当一个的主函数太过庞大时,会将主函数按功能进行拆分,根据是否须要向外部提供接口,分为静态函数和普通函数,
普通的函数是跨文件可见的, 可是若是是静态函数的话他的可见范围会被缩小到本文件可见,外部文件是没法进行调用的。函数

static int max (int x, int y) { //函数体 } 
 //静态函数主要功能是能够缩小该函数的可见范围,减小函数重名的几率;
// 通常静态函数会被定义在头文件中,在须要使用的文件中能够包含该文件便可使用。

递归函数

 若是一个函数内部有本身调用本身的语句,则它是递归函数。
 注意:
 emsp;1.递归函数必须有结束条件,否则会一直调用下去,将栈溢出,栈崩溃,最后致使程序异常退出;
 emsp;2.递归函数包含两个过程,一个是逐层递进,和逐步递归。指针

/*倒序打印 */
 void func( int num ){     
    if (num > 1){      

    func(num-1);   
 }     
    printf("%d\n" , num );      
 }

注意:
1.在递归函数使用的过程当中,栈空间消耗很是大,递归的层次越多栈空间剩余空间间越少,很容易会把栈空间耗尽 。
2.在层层递进的过程当中问题的规模,应该逐步减少,也就是某个形式参数应该逐步减少,每次递归判断该形式参数是否知足返回条件。code

回调函数

 每一个函数都有一个入口地址,但调用此地址时就会调用此函数。函数指针就是用来保存函数的入口地址的,当函数的实现方不方便直接调用某个功能,可将函数的入口地址传递给函数指针,调用此函数指针即可以间接调用原来的函数,这种调用方式称为回调函数。递归

bool func_1( int (*p) (int ,int )); 
 int func_2(int a , int b); 
 int main(int argc, char const *argv[]) {     
    bool a = func_1(func_2);//func_2是一个函数的地址 
 if (a) { 

   printf("函数调用成功 !! \n");  
 }    
 else{ 

   printf("函数调用失败 !! \n");   
 }      
 return 0; 
 } 
 bool func_1( int (*p) (int ,int ) ){  
   
   if ( NULL == p ){// 先判断p是否指向一个NULL       
   return false ;   
 }         
 printf("我在函数1 !!\n");    
     
 int num = p(103 , 229);//经过函数指针P来调用函数func_2   
 printf("num:%d\n" , num);   
 return true ;
 } 
 int func_2(int a , int b){   

   return a<b ? a:b ; 
 }

注意:
1.传递和接收函数地址时&,*可省略。接口

//幂运算
 int exponentiation(int n, int i){

    if(i == 0){

         return 1;
    }
    else{

        return exponentiation(n, i-1)*n;
    }

}
//阶乘
int Factorial(int n) {

   if(n == 1) {//使递归结束的条件

         return 1;//1! 等于1
   
       }
       else{//使递归进行的条件
 
         return(Factorial(n-1) * n);//n! = (n-1)! * n;
     }
}
相关文章
相关标签/搜索