递归和非递归分别实现求第n个斐波那契数

运行环境 win10  vs2013

      首先我们需要知道什么是菲波那切数列     

        斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……

    想要输出斐波那契数列只需要找到其中的规律即可, 简单来说 从第三项起 前面两个数相加的和等于第三个数,所以我们在写程序是只需要直接输出前两项 1,1然后利用递归函数直接来计算后面的值,由于使用递归函数基数数量级过大所耗费的时间也就越多,所以我们假设只输出第八项的数值

程序如下:

递归和非递归分别实现求第n个斐波那契数

 

运行结果如图

递归和非递归分别实现求第n个斐波那契数

#include<stdio.h>
#include<stdlib.h>
//求第n项斐波那契数列
int  Lib(int n){
	if (n == 1 || n == 2){
		return 1;
	}
	return Lib(n - 1) + Lib(n - 2);
}
int main(){
	printf("%d\n",Lib(8)); 
	system("pause");
	return 0;
}

 

为了体现用递归函数计算数量级过大时间耗费多,可以尝试求第100项

运行结果

递归和非递归分别实现求第n个斐波那契数看似什么都没有,其实计算机正在快速运算,

递归和非递归分别实现求第n个斐波那契数

 

      如果不使用递归函数也可快速求值,在计算出某一项是将其保存,在计算后面的项时直接使用,避免多次计算,将极大的减少运算时间

接下来我们不采用递归计算第100项

递归和非递归分别实现求第n个斐波那契数

运行结果

递归和非递归分别实现求第n个斐波那契数

可以看到虽然第100项出现溢出但是能快速计算出来,改为第8项查看结果

递归和非递归分别实现求第n个斐波那契数

   总结:

          解决一个问题,往往可以使用递归的方式,也可以使用非递归的(循环)的方式,递归的方式打吗通常更加直观更简洁,但是运行效率可能会降低,使用非递归方式代码通常更加繁琐,但是运行效率可能会比较高