算法緒論

怎麼描述一個算法的優劣呢

使用斐波那契數列遞歸和非遞歸算法進行討論.
斐波那契數列的結構是這樣:    \Gamma(n) = \Gamma(n-1)  + \Gamma(n-2) \ || \ 1(n=0或1)\quad\forall n\in\mathbb N,即如圖所示 算法

斐波那契數列

相應算法(c語言)

  • 遞歸展現
int recursion_fibonacci(int n) {
	if (n == 0)return 1;
	if (n == 1)return 1;
	return recursion_fibonacci(n - 1) + recursion_fibonacci(n - 2);
}
複製代碼
  • 非遞歸展現
void nonrecursion_fibonacci(int n) {
	int Fn = 1, Fn_1 = 1, Fn_2 = 1;
	if(n>2)
	{
	    for(int i = 2;i<=n;i++)
		{
			Fn = Fn_1 + Fn_2;
			Fn_2 = Fn_1;
			Fn_1 = Fn;
		}
	}
	printf("數值是%d", Fn);
}
複製代碼
  • 完整算法
#include <stdio.h>
#include <time.h>
int recursion_fibonacci(int n) {
	if (n == 0)return 1;
	if (n == 1)return 1;
	return recursion_fibonacci(n - 1) + recursion_fibonacci(n - 2);
}

int nonrecursion_fibonacci(int n) {
	int Fn = 1, Fn_1 = 1, Fn_2 = 1;
	if(n>2)
	{
	    for(int i = 2;i<=n;i++)
		{
			Fn = Fn_1 + Fn_2;
			Fn_2 = Fn_1;
			Fn_1 = Fn;
		}
	}

	printf("數值是%d", Fn);
}
int main(void) {
    clock_t  start, end;
	start = clock();

	printf("數值是%d", recursion_fibonacci(5));
	nonrecursion_fibonacci(5);


	end = clock();
	printf("執行速度%6.3fs", (double)(end-start)/ CLOCKS_PER_SEC);
	
    return 0;
}
複製代碼
  • 算法複雜度比較
函數 時間複雜度 空間複雜度
recursion \begin{equation} O(2^n)\end{equation} \begin{equation} O(n)\end{equation}
nonrecursion \begin{equation} O(n)\end{equation} \begin{equation} O(1)\end{equation}
相關文章
相關標籤/搜索