fibonacci斐波那契數列詳解 遞迴求Fn非遞迴求Fn求n最近的斐波那契數
斐波那契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,也是我自己寫的。但是我還沒完全理解。後續再更
相關文章
- Java語言非遞迴求第n個斐波那契數Java遞迴
- 斐波那契數列(Fibonacci)遞迴和非遞迴實現遞迴
- 斐波那契數列的遞迴和非遞迴實現遞迴
- 斐波那契數列詳解
- 斐波那契數列
- 斐波那契數
- 斐波那契數列(Java)Java
- JavaScript斐波納契數列非遞迴演算法JavaScript遞迴演算法
- 面試:老師講的遞迴解決斐波那契數列真的好嗎面試遞迴
- 斐波那契數列 (C#)C#
- PHP 與斐波那契數列PHP
- 【演算法詳解】斐波那契數列 - Fibonacci sequence演算法
- HDU2813Interesting Fibonacci(斐波那契數列+迴圈節)REST
- “斐波那契數列”問題的遞推演算法演算法
- js實現斐波那契數列JS
- 斐波那契數列js 實現JS
- 斐波那契數列演算法演算法
- 斐波那契數列Ⅳ【矩陣乘法】矩陣
- python for迴圈和斐波那契Python
- 面試官:用“尾遞迴”優化斐波那契函式面試遞迴優化函式
- Leedcode-斐波那契數
- 演算法(1)斐波那契數列演算法
- 面試題9-斐波那契數列面試題
- [C103] 斐波那契數列
- 大數斐波那契數列的演算法演算法
- 斐波那契數列的分治法計算
- 斐波那契數列的python實現Python
- 斐波那契查詢
- 使用Python實現斐波那契數列Python
- JavaScript 實現:輸出斐波那契數列JavaScript
- js迭代器實現斐波那契數列JS
- 演算法一:斐波那契阿數列演算法
- 計算斐波那契數列的演算法演算法
- 基於C語言用遞迴思想實現斐波那契數列的函式設計C語言遞迴函式
- 【演算法】Fibonacci(斐波那契數列)相關問題演算法
- 斐波那契數(C/C++,Scheme)C++Scheme
- 斐波那契數列三種實現函式函式
- 劍指offer-9-斐波那契數列-javaJava