1. 程式人生 > >初夏小談:斐波那契三種實現方法(C語言版)(第三種相信你沒見過)

初夏小談:斐波那契三種實現方法(C語言版)(第三種相信你沒見過)

斐波那契數列(Fibonaccisequnce),又稱黃金分割數列。研究斐波那契數列有相當重要的價值,例在現代物理、準晶體結構、化學等領域都有直接的應用。因此研究斐波那契數列也是很有必要的。

今天初夏將為大家帶來計算斐波那契數列第n位的三種方法

第一種利用遞迴的方法計算,程式碼相當簡單,但其重複計算率太高,導致其時間複雜度比指數還要爆炸式增長。不推薦此方法。但遞迴的思想卻相當的重要還是要理解並掌握。

#include<Aventador_SQ.h>

int  Fibonacci(int n)
{
	if (1 == n|| 2 == n)
	{
		return 1;
	}
	else
	{
		return Fibonacci(n - 1) + Fibonacci(n - 2);
	}
}
int main()
{
	int n = 0;//求取第n個數
	int	a = 0;//所求的數
	scanf("%d", &n);
	a=Fibonacci(n);
	printf("第%d個數是%d\n",n,a);
	system("pause");
	return 0;
}

第二種是利用迴圈的方法,藉助三個變數進行交換。其時間複雜度是O(n)

#include<Aventador_SQ.h>

void Fibonacci(int x)
{
	if (x < 1)
	{
		printf("輸入錯誤!!!\n");
	}
	else if (x < 3)
	{
		printf("第%d個數是1\n", x );
	}
	else
	{
		int FiboOne = 1;
		int FiboTwo = 1;
		int FiboN = 0;
		int i=0;
		for (i = 3; i <= x; i++)
		{
			FiboN = FiboOne + FiboTwo;
			FiboOne = FiboTwo;
			FiboTwo = FiboN;
			//printf("%d\t%d\n", i, FiboN);
		}
		printf("第%d個數是%d\n", x, FiboN);
	}
}
int main()
{
	int n;
	scanf("%d", &n);
	Fibonacci(n);
	system("pause");
	return 0;
}

第三種到了最傷腦子的演算法即矩陣,但執行速度大大提高。

#include<Aventador_SQ.h>

void Fibonacci(int x)
{
	int FFiboZero = 0, FiboZero = 0;
	int FFiboOne = 1, FiboOne = 1;
	int FFiboTwo = 1, FiboTwo = 1;
	int FiboN = 0;

	int i = 0;
	for (i = 2; i <= (x / 2); i++)
	{
		FiboN = FFiboTwo * FiboTwo + FFiboOne * FiboOne;//利用矩陣求出待求得數字
		//進行交換達到移動中間變數
		FFiboZero = FFiboOne;
		FFiboOne = FFiboTwo;
		FFiboTwo = FiboN;
	}
	FiboN = FFiboTwo * FFiboTwo + FFiboOne * FFiboOne;//得到最終的所求取得數
	printf("%d\t%d\n", x, FiboN);
}

void JFibonacci(int x)
{
	int FFiboZero = 0, FiboZero = 0;
	int FFiboOne = 1, FiboOne = 1;
	int FFiboTwo = 1, FiboTwo = 1;
	int FiboN = 0;

	int i = 0;
	for (i = 2; i <= ((x - 1) / 2); i++)
	{
		FiboN = FFiboTwo * FiboTwo + FFiboOne * FiboOne;
		FFiboZero = FFiboOne;
		FFiboOne = FFiboTwo;
		FFiboTwo = FiboN;
	}
	//當所求的位數是奇數時要另外計算第三種情況
	FiboN = FFiboTwo * FFiboTwo + FFiboOne * FFiboOne;
	FFiboTwo = FFiboTwo * FFiboOne + FFiboOne * FFiboZero;
	FiboN = FiboN * FiboTwo + FFiboTwo * FiboOne;
	printf("%d\t%d\n", x, FiboN);
}

int main()
{
	int n = 0;
	printf("n位數:");
	scanf("%d", &n);
	if (n % 2 == 0)
	{
		JFibonacci(n);//n可以被2整除
	}
	else
	{
		Fibonacci(n);//n不能被2整除
	}
	system("pause");
	return 0;
}

與君共享,如果有更好的建議或意見歡迎留言。

QQ2630420233

                                                                                                                                                                                                珍&原始碼