斐波那契 Fibonacci 數列的七種實現方法

2021-09-06 22:05:08 字數 1871 閱讀 4161

廢話不多說,直接上**

#include "stdio.h"

#include "queue"

#include "math.h"

using namespace std;

/////一:遞迴實現

// 使用公式f[n]=f[n-1]+f[n-2],依次遞迴計算,遞迴結束條件是f[1]=1,f[2]=1。

///int fib1(int index)

if(index==1 || index==2)

return 1;

return fib1(index-1)+fib1(index-2);

}///

//二:陣列實現

// 空間複雜度和時間複雜度都是0(n),效率一般,比遞迴來得快。

///int fib2(int index)

if(index<3)

int *a=new int[index];

a[0]=a[1]=1;

for(int i=2;i實現

// 時間複雜度是0(n),空間複雜度是0(1),當然vector有自己的屬性會占用資源。

/int fib3(int index)

vectora(2,1); //建立乙個含有2個元素都為1的向量

a.reserve(3);

for(int i=2;i實現

// 當然佇列比陣列更適合實現斐波那契數列,時間複雜度和空間複雜度和vector一樣,但佇列太適合這裡了,

// f(n)=f(n-1)+f(n-2),f(n)只和f(n-1)和f(n-2)有關,f(n)入佇列後,f(n-2)就可以出佇列了。

///int fib4(int index)

queueq;

q.push(1);

q.push(1);

for(int i=2;i七:矩陣乘法

最後一種方法不是一種實用的方法,也比較難以想到,其演算法實現也比較複雜,在此單述。

我們將數列寫成:

fibonacci[0] = 0,fibonacci[1] = 1

fibonacci[n] = fibonacci[n-1] + fibonacci[n-2] (n >= 2)

可以將它寫成矩陣乘法形式:

將右邊連續的展開就得到:

下面就是要用o(log(n))的演算法計算:

#includestruct matrix2by2

long long m_00;

long long m_01;

long long m_10;

long long m_11;

};matrix2by2 matrixmultiply

( const matrix2by2& matrix1,

const matrix2by2& matrix2

)matrix2by2 matrixpower(unsigned int n)

else if(n % 2 == 0)

else if(n % 2 == 1)

return matrix;

}long long fib7(unsigned int n)

; if(n < 2)

return result[n];

matrix2by2 powernminus2 = matrixpower(n - 1);

return powernminus2.m_00;

}//簡單的測試

int main()

斐波那契 Fibonacci 數列

實踐證明,尾遞迴 確實比普通遞迴效率高。下面的例子 用 普通遞迴需要10s完成 而用尾遞迴,只用了1s不到 package com.zf.dg 題目 有一種母牛,出生後第三年,開始生育,每年都生一頭 母牛 貌似單性生育,這裡就沒公牛什麼事兒 生出來的小母牛也符合同樣的規律,出生後第三年,開始生 育,...

Fibonacci 斐波那契數列

一 介紹 在數學上,費波那契數列是以遞迴的方法來定義 0 f 0 1 f 1 f f f f f n 2 用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就是由之前的兩數相加而得出。首幾個費波那契係數是 0,1,1,2,3,5,8,13,21,34,55,89,144,233 oeis中...

斐波那契數列(Fibonacci)

斐波那契數列 無窮數列 1,1,2,3,5,8,13,21,34,55.稱為fibonacci數列。它可以定規地定義為 n 0,1 f n 1 n 1 f n f n 1 f n 2 這是乙個遞迴的關係式,它說明當n大於1時,這個數列的第n項的值,是它前面兩項的和,它用兩個較小的自變數的函式值來定義...