递归函数和函数指针
递归函数是指一个函数的函数体中直接或间接调用了该函数自身
递归函数调用的执行过程分为两个阶段:
递推阶段:从原问题出发,按递归公式递推从未知到已知,最终达到递归终止条件
回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解.
编写一个递归函数,计算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);
}
}
函数指针用来存放函数的地址,这个地址是一个函数的入口地址
函数名代表了函数的入口地址
函数指针变量说明的一般形式如下
<数据类型> (<函数指针名称>)(<参数说明列表>);
<数据类型>是函数指针所指向的函数的返回值类型
<参数说明列表>应该与函数指针所指向的函数的形参说明保持一致
(<函数指针名称>)中,说明为指针()不可缺省,表明为函数的指针
函数指针数组是一个保存若干个函数名的数组
一般形式如下
**<数据类型> (<函数指针数组名称> [<大小>] )(<参数说明列表> );**
其中,<大小>是指函数指针数组元数的个数
其它同普通的函数指针
例程
#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函数来实现整形数组的排序。
// 有点难 涉及回调函数
#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);
}