递归的定义:在一个函数中再次调用该函数的行为叫做递归。
我们可以编写一个求阶乘的代码如下:
int fact(int n)
{
if(n == 0) return 1;
return n * fact(n-1);
}
递归必须要有一个终止条件,不然递归会一直进行下去。同理可得,斐波那契数列的定义为a0=0,a1=1,an = an-1 + an-2(n>1),我们可以的到他的代码,这里就不给出了。
然而,递归有一个经典的问题,即使在求解一个问题的时候,时间复杂度的规模会以指数规模来成长,针对斐波那契数列,我们求解n=40的时候,都会花费较大的时间,针对这种问题,我们可以采用将结果预先存储的方法,在求解到具体的某一步时,我们首先查看这个结果是否在之前是否计算过,然后决定是否求解,这种方法,大大降低了运算时间,优化了空间。我们的代码如下:
int memo[MAX_N+1];
int fib(int n)
{
if(n < 1) return n; //两个初识情况
if(memo[n] != 0) return memo[n];
return memo[n] = fib(n - 1) + fib(n -2);
}