求第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;
}
相比較而言 代碼二 在函數內部進行了一些優化。
代碼一是選擇語句加循環語句
代碼二是隻有循環語句
代碼會更加簡潔一些
== 如果函數法存在明顯的缺陷,那就使用迭代法==
儘管迭代法相對來說比較複雜,但還是要掌握。
最後
今天又重新回顧了以下函數的地方,發現自己確實對遞歸的理解不顧深刻,掌握度也不好。
這兩天不知道咋了,好像厭學了一樣。
本來這個兩天前就寫了一半 也一直在草稿箱裏面放着,然後就沒有然後。
真的在家有點頹。