求第n個斐波那契數 (函數與迭代)

求第n個斐波那契數

斐波那契數
1 1 2 3 5 8 13 21 …
fib(n)
n<=2 1
n>2 fib(n-1)+fib(n-2)

函數法

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

int fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return fib(n - 1) + fib(n - 2);

}
int main()
{
	int n = 0;
	printf("請輸入求第幾個斐波那契數\n");
    scanf("%d", &n);
	fib(n);
    int ret = fib(n);
	printf("第%d個斐波那契數爲%d", n, ret);
    
    system("pause");
	return 0;
}

在這裏插入圖片描述

但是問題來了
在這裏插入圖片描述

遞歸向下的層次太深了效率大大降低
最後遞歸的出口一定是回到了計算第一個與第二個的和上
以5 爲例子
在這裏插入圖片描述

迭代(即爲循環)
代碼一

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int fib(int n)
{
	
	if (n <= 2)
	{
		return 1;
	}
	else
	{
		int i = 0; 
		int a = 1;
		int b = 1;
        int c = 0;
		//循環法就只能從前往後求
		for (i = 2; i < n; i++)
		{
	        c= a + b;
		    a = b;
		    b = c;
		 }
		return c;
	}
}

int main()
{
	int n = 0;
	printf("請輸入求第幾個斐波那契數\n");
	scanf("%d", &n);
	fib(n);
    int ret = fib(n);
    printf("第%d個斐波那契數爲%d", n, ret);

	system("pause");
	return 0;

}

代碼二

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int fib(int n)
{
	int i = 0; 
    int a = 1;
    int b = 1;
    int c = 1;
    for (i = 0; i <n-2; i++)
	{
		 c= a + b;
         a = b;
	     b = c;
    }
		return c;
}


int main()
{
	int n = 0;
	
	//int ret=0;   如果在外部定義 之要除了循環ret 永遠是0
	printf("請輸入求第幾個斐波那契數\n");
	scanf("%d", &n);
	


	fib(n);
   int ret = fib(n);
	
    printf("第%d個斐波那契數爲%d", n, ret);

	system("pause");
	return 0;

}

相比較而言 代碼二 在函數內部進行了一些優化。
代碼一是選擇語句加循環語句
代碼二是隻有循環語句
代碼會更加簡潔一些

== 如果函數法存在明顯的缺陷,那就使用迭代法==
儘管迭代法相對來說比較複雜,但還是要掌握。

最後

今天又重新回顧了以下函數的地方,發現自己確實對遞歸的理解不顧深刻,掌握度也不好。

這兩天不知道咋了,好像厭學了一樣。
本來這個兩天前就寫了一半 也一直在草稿箱裏面放着,然後就沒有然後。
真的在家有點頹。

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