【演算法詳解】斐波那契數列 - Fibonacci sequence
1. 斐波那契數列定義
線上測試工具: http://zh.numberempire.com/fibonaccinumbers.php
2. 演算法
求解斐波那契數列的第n個數:
2.1 遞迴/分治法
#include <cstring>
#include <iostream>
using namespace std;
unsigned long fabinacci(unsigned int n)
{
if (n == 0)
{
return 0;
}else
if (n == 1)
{
return 1;
}else
{
return fabinacci(n - 2) + fabinacci(n - 1);
}
}
int main()
{
unsigned int n = 0;
cout<<"Please input a unsigned integer:"<<endl;
cin>>n;
cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n);
return 0;
}
遞迴效率分析:
以計算f(10)為例:
![](https://i.iter01.com/images/f74f10e7ae8a444ca5dc44459c545e0c715d9a959e81a93121e2a8fb18eaec86.png)
從圖中可以看出:要計算很多重複的之,計算重複值的數量隨著N值而急劇增大。事實上該演算法的時間複雜度隨著n值呈指數增長 O((3/2)^n)。
2.2 迭代求解
迴圈求解:
#include <cstring>
#include <iostream>
using namespace std;
long long fabinacci(unsigned int n)
{
if (n == 0)
{
return 0;
}else
if (n == 1)
{
return 1;
}
long long first = 0;
long long second = 1;
for (unsigned i = 1; i < n; i++)
{
second = first + second;
first = second - first;
}
return second;
}
int main()
{
unsigned int n = 0;
cout<<"Please input a unsigned integer:"<<endl;
cin>>n;
cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n);
return 0;
}
時間複雜度為:O(n);
2.3 通向求解
![](https://i.iter01.com/images/fa1d5c48707f5e155fbeeb97e8d058abf28d0d7b01e2bcb4dc0a815061074b8c.png)
2.4 矩陣乘法 / 分治策略
推導:
#include <cstring>
#include <iostream>
using namespace std;
void MatrixMulti(long long matrix[2][2],long long matrix2[2][2])
{
long long a = matrix[0][0] * matrix2[0][0] + matrix[0][1] * matrix2[1][0];
long long b = matrix[0][0] * matrix2[0][1] + matrix[0][1] * matrix2[1][1];
long long c = matrix[1][0] * matrix2[0][0] + matrix[1][1] * matrix2[1][0];
long long d = matrix[1][0] * matrix2[0][1] + matrix[1][1] * matrix2[1][1];
matrix[0][0] = a;
matrix[0][1] = b;
matrix[1][0] = c;
matrix[1][1] = d;
}
long long fabinacci(int value)
{
if(value == 0)
{
return 0;
}
long long A[2][2] = {1,1,1,0};
long long Matrix[2][2] = {1,0,1,0};
int n = value - 1;
for(; n ;n >>= 1)
{
//odd
if(n&1)
{
MatrixMulti(Matrix,A);
}
MatrixMulti(A,A);
}
return Matrix[0][0];
}
int main()
{
unsigned int n = 0;
cout<<"Please input a unsigned integer:"<<endl;
cin>>n;
cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n);
return 0;
}
相關文章
- 斐波那契數列詳解
- 【演算法】Fibonacci(斐波那契數列)相關問題演算法
- fibonacci斐波那契數列詳解 遞迴求Fn非遞迴求Fn求n最近的斐波那契數遞迴
- 斐波那契數列演算法演算法
- 斐波那契數列
- 演算法(1)斐波那契數列演算法
- 斐波那契數列(Java)Java
- 《每日一題》842. Split Array into Fibonacci Sequence 將陣列拆分成斐波那契序列每日一題陣列
- 演算法一:斐波那契阿數列演算法
- 大數斐波那契數列的演算法演算法
- 斐波那契數列 (C#)C#
- PHP 與斐波那契數列PHP
- 著名的斐波那契數列
- 計算斐波那契數列的演算法演算法
- 斐波那契數
- js實現斐波那契數列JS
- 第十題:斐波那契數列
- [C103] 斐波那契數列
- 力扣之斐波那契數列力扣
- 劍指offer——斐波那契數列
- 斐波那契數列js 實現JS
- 斐波那契數列Ⅳ【矩陣乘法】矩陣
- rust實戰系列 - 使用Iterator 迭代器實現斐波那契數列(Fibonacci )Rust
- 使用Python實現斐波那契數列Python
- 斐波那契數列的來源——數兔子
- 斐波那契數列數與等冪和
- Leedcode-斐波那契數
- 509. 斐波那契數
- LeetCode 509[斐波那契數]LeetCode
- 一千位斐波那契數
- js迭代器實現斐波那契數列JS
- offer通過--9斐波那契數列-2
- JavaScript 實現:輸出斐波那契數列JavaScript
- 斐波那契數列:7數5層魔法塔(3)
- 斐波那契數列:7數5層魔法塔(2)
- 斐波那契數列:7數5層魔法塔(5)
- 斐波那契數列:7數5層魔法塔(8)
- 斐波那契數列:7數5層魔法塔(13)
- 斐波那契數列:7數5層魔法塔(12)