程序设计竞赛2.1.1 递归

递归的定义:在一个函数中再次调用该函数的行为叫做递归。


我们可以编写一个求阶乘的代码如下:

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); 
}

猜你喜欢

转载自blog.csdn.net/nineship/article/details/80658741