函数学习5 递归函数和函数指针

## 递归函数和函数指针
递归函数是指一个函数的函数体中直接或间接调用了该函数自身
递归函数调用的执行过程分为两个阶段: 
递推阶段:从原问题出发,按递归公式递推从未知到已知,最终达到递归终止条件
回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解.

编写一个递归函数,计算n!

#include<stdio.h>

int jiecheng(int a);
int main(int argc, const char *argv[])
{
    int a;
    a =jiecheng(5);
    printf("\n%d\n",a);
    return 0;
}

int jiecheng(int a)
{
    if (a==1||a==0)
        return 1;
    else return (a* jiecheng(a-1));


}

编写一个递归函数,计算斐波那契数列
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对
两个月后,生下一对小兔对数共有两对
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对

#include <stdio.h>
int rabbit(int a );
int main(int argc, const char *argv[])
{
    int a ;
    a=rabbit(10);
    printf ("%d\n",a);
    return 0;
}

int rabbit(int a)
{
    if (a==0||a==1||a==2)
    {
        return 1;
    }else
    {
        return rabbit(a-1)+rabbit(a-2);
    }
}


函数指针用来存放函数的地址,这个地址是一个函数的入口地址
函数名代表了函数的入口地址
函数指针变量说明的一般形式如下
<数据类型> (*<函数指针名称>)(<参数说明列表>);
<数据类型>是函数指针所指向的函数的返回值类型
<参数说明列表>应该与函数指针所指向的函数的形参说明保持一致
(*<函数指针名称>)中,*说明为指针()不可缺省,表明为函数的指针
函数指针数组是一个保存若干个函数名的数组
一般形式如下
**<数据类型>  (*<函数指针数组名称> [<大小>] )(<参数说明列表> );**

int   (*p[3])(int ,int);
其中,<大小>是指函数指针数组元数的个数
其它同普通的函数指针
例程

#include<stdio.h>
int add(int a, int b)
{
return  a+b;
}
int sub(int a ,int b)
{
return a-b;
}
int mul(int a,int b)
{
return a*b;
}
int div(int a,int b)
{
return a/b;
}

int main(int argc, const char *argv[])
{
    int m=10,n=20;
    int (*p[4])(int,int); //标准模式为 (*p)(int ,int) 

    p[0]=add;
    p[1]=sub;
    p[2]=mul;
    p[3]=div;
    printf(" %d %d %d %d \n",(*p[0])(m,n),(*p[1])(m,n),(*p[2])(m,n),(*p[3])(m,n));
    return 0;
}

编写递归函数要注意什么问题? 要有递归规律和递归出口
调用C库中的qsort函数来实现整形数组的排序。```c

// 有点难 涉及回调函数
#include <stdio.h>
#include <stdlib.h>

int compare(const void *, const void *);

int main(int argc, char *argv[])
{
        int s[] = {89, 23, 10, 8, 7, 61}, n, i;

        n = sizeof(s)/sizeof(int);

        qsort(s, n, sizeof(int), compare);

        for (i = 0; i < n; i++)
                printf("%d ", s[i]);
        puts("");

        return 0;
}

int compare(const void * p, const void * q) 
{
        return (*(int *)p - *(int *)q);

}


```
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值