fibonacci斐波那契數列詳解 遞迴求Fn非遞迴求Fn求n最近的斐波那契數

蔡尼瑪發表於2020-12-12

斐波那契fibonacci

斐波那契額數列即前兩項F(0)和F(1)都是1,之後的每一項都是前兩項相加和即F(3)=2,F(4)=3,F(5)=5;
通項公式:F(n+2)=F(n+1)+F(n)。

1.遞迴求fn

給出一個n 求斐波那契數列的Fn
遞迴解法即寫一個遞迴函式,注意兩個點
1: 遞迴邊界條件(n=0或者n=1)
2:遞迴式 F(n+2)=F(n+1)+F(n)
程式碼:

#include<cstdio>
int F(int n)
{
	if(n==0||n==1) return 1;//遞迴邊界
	else return F(n-1)+F(n-2);//遞迴式
}
int main()
{
	int n;
	scanf("%d",&n);
	printf("%d\n",F(n));
	return 0 ;
}

2.非遞迴求fn

因為遞迴雖然寫起來非常方便,但是非常消耗空間,因此還需要掌握非遞迴演算法,下圖是遞迴演算法之後的結果在這裡插入圖片描述
那麼,如何解決呢?
思路:用for迴圈

#include <cstdio>
int main()
{
	int n,Fn;
	scanf("%d",&n);
	int F1=1;           //初始化
	int F2=1;
	for(n=n-2;n>0;n=n-2)
	{	
		F1=(F1+F2);
		F2=(F1+F2);
	}
	Fn=F1;
	if(n==0)			//判斷輸出哪個位置上的數字
		Fn=F2;
	printf("%d\n",Fn);
}

舉個例子就能看懂了吧
在這裡插入圖片描述
就是用兩個變數來迴圈相加。

3.求給出n最近的fibonacci數(2020年冬季pat甲組第一題)

題目是給出一個n 求離這個n最近的斐波那契數,如果前後兩個斐波那契數距離一樣,輸出較小的斐波那契數(這個斐波那契數列是從0、1開始的)

AC程式碼:

#include <cstdio>
using namespace std;
int main()
{
    int a,b,c,n;
    scanf("%d",&n);
    a=0;b=1;
    while(c<=n)
    {
        if(a+b-n>=n-c)
        {
            break;
        }
        c=a+b;
        a=b;
        b=c;
    }
    printf("%d",c);
}

這個程式碼雖然能跑AC,也是我自己寫的。但是我還沒完全理解。後續再更

相關文章