递归算法效率简析

前面文章提到过递归算法,作了一些基础的介绍,举了几个比较简单的例子。
今天同样是递归问题,来给大家分享一下。

递归最常遇到的问题就是栈溢出,所以在函数递归时一定要有合适的终止条件函数在每次递归时,每进行一次新的调用,都将创建一批变量,它们将掩盖递归函数前一次调用所创建的变量。

对于前一节讲到的用递归函数实现阶乘,其实并不是阶乘的很好的一个例子,很多人认为这种做法比较“高级”,实则不然,这种做法的效率对于用循环求阶乘没有任何优势,反而有些问题用阶乘来做会带来恐怖的效率之低      》__》   要明白:阶乘是函数的一次一次调用,每个函数的开启,参数必须压到堆栈中,为局部变量分配内存空间,寄存器的值必须保存等等,所有的递归均如此,所以简单的循环迭代可以解决的事,何必大开内存消耗呢??

如果你有所怀疑,你可以尝试一下用阶乘来求斐波那契数,斐波那契数就是以阶乘的形式定义的,那用阶乘来求有何不妥??把下面代码运行一下,计算第五十个斐波那契数,可以尝试一下用下面这个递归算法算出结果得多长时间   -_-

#include
int fibonacci(int n);
int main()
{
	int n = 0;
	printf("please enter a figer>\n");
	scanf("%d", &n);
	printf("%d",fibonacci(n));
	return 0;
}
int fibonacci(int n)
{
	if (n <= 2)
	return 1;
	else
	return fibonacci(n-1) + fibonacci(n-2);
}

目测估计至少要算十分钟........这效率,不敢想象吧,所以不仅要会递归,还要知道啥时候该用啥时候不该用!!
简单的分析一下为啥上面用递归来求一个稍微比较大的斐波那契数就如此之低效率,在函数中,每一个斐波那契数的计算都分割为前一个数和前前一个数,以此类推,不知是否听说过2的n次方的恐怖,,,所以在计算第三十个斐波那契数时,第三个斐波那契数就要被计算317811次.......,当计算第五十个斐波那契数时,可以想象,你的电脑在疯狂运转,可依旧得不出结果!!
所以,斐波那契数的计算得用迭代的方法来计算,代码如下:

#include
int main()
{
	int x = 0;
	printf("请输入你要求的第n个斐波那契数:\n");
	scanf("%d",&x);
	long next = 1;
	long previous = 1;
	long result = 1;
	while (x > 2)
	{
		x--;
		previous = next;
		next = result;
		result = next + previous;
	}
	printf("斐波那契数为:%ld\n", result);
	return 0;
}

 

你可能感兴趣的:(c,算法)