【C語言】fibonacci數列 的遞歸和非遞歸 +淺談遞歸優劣

一、基礎概念:

斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、……在數學上,斐波納契數列以如下被以遞歸的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)

二、代碼

#include <stdio.h>
int fib1(int n)
int fib2(int n);

int main()
{
	int n=0;
	printf("fibonacci數列下標:\n");
	scanf("%d",&n);
	printf("第n=%d的數列值是:%d\n",n, fib1(n));
	return 0;
}
//非遞歸
int fib2(int n)
{
	int a = 1;
	int b = 1;
	int c = a = b;
	int i = 0;
	for (i = 3; i <= n; i++)
	{
		c = a + b;
		a = b;
		b = c;
	}
	return c;
}
//遞歸
int fib1(int n)
{
	if (n <= 2)
		return 1;
	else
		return fib1(n - 2) + fib1(n - 1);
}
三、運行結果



四、遞歸的優劣

遞歸好處:代碼更簡潔清晰,可讀性更好 遞歸可讀性好這一點,對於初學者可能會反對。實際上遞歸的代碼更清晰,但是從學習的角度要理解遞歸真正發生的什麼,是如何調用的,調用層次和路線,調用堆棧中保存了什麼,可能是不容易。但是不可否認遞歸的代碼更簡潔。一般來說,一個人可能很容易的寫出前中後序的二叉樹遍歷的遞歸算法,要寫出相應的非遞歸算法就比較考驗水平了,恐怕至少一半的人搞不定。所以說遞歸代碼更簡潔明瞭。

遞歸壞處:由於遞歸需要系統堆棧,所以空間消耗要比非遞歸代碼要大很多。而且,如果遞歸深度太大,可能系統撐不住。

 

總之,調用函數要消耗資源,所以遞歸空間和時間消耗都大,而且,如果遞歸太深,會堆棧溢出,系統撐不住。


因此,若出現類似僞遞歸算法,儘量使用非遞歸方式解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章