廢話不多說,直接上**
#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項的值,是它前面兩項的和,它用兩個較小的自變數的函式值來定義...