递归法把问题转化为规模更小的子问题解决。
递归法思路清子晰,编程简单,但有时候难以想到。
如果确定了用递归法解题,思考的重点应放到建立原问题和子问题之间的联系。
有的问题有很明显的递归结构,但需要仔细思考,才能转化为相同的子问题。
边界条件与递归方程是递归函数的两个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。
斐波那契数列
我们知道斐波那契数列的前面几项,1、1、2、3…,和斐波那契数列的递推公式为
F[i] = F[i-1] + F[i-2]
现在给出一个n,计算出F[n]的值。
#include<stdio.h>
#include<time.h>
int num=0;
int F(int a)
{
num++;
if(a==0 || a==1)
return 1;
else
return F(a-1)+F(a-2);
}
int main()
{
long op,ed;
int n;
while(scanf("%d",&n)!=EOF)
{
num=0;
op=clock();
printf("F(%d) = %d\n",n,F(n));
printf("递归次数:%d\n",num);
ed=clock();
printf("时间:%ldms\n",ed-op);
}
return 0;
}
1
F(1) = 1
递归次数:1
时间:1ms<