Algorithm2 斐波那契數列

2021-08-08 13:34:33 字數 1498 閱讀 8001

本系列演算法實現都是在學習資料結構(c++語言版),清華大學鄧俊輝教授編,聽鄧老師edx網課過程中自己實現的例子。

問題: 求fibonacci第n項?

解決: 用以下四種種方法實現。

遞迴最簡單,但是演算法複雜度高,為o(2^n)

//! usual recursion

// 0 1 2 3 5 8

int fib_recursion(int n)

//! calculate by formular

int fib_formular(int n)

有兩種實現方法,基本思想是dp,動態規劃包含內容很多,可以專門學習下。

//! dynamic programming (dp)

int fib_dynamic_programming_n(int n)

return a[n];

}//! dynamic programming (dp)

int fib_dynamic_programming_3(int n)

return cur;

}

遞推公式如下,

公式推導見fibonacci 維基百科和gocalf blog——計算斐波納契數,分析演算法複雜度

#include 

//! matrix method

int fib_matrix(int n)

其中關於快速求解矩陣冪使用的是以下演算法

#include 

//! solve matrix^n

void fast_pow_matrix(eigen::matrix2i& base, int n, eigen::matrix2i& r)

}

其實用到的演算法和求單個數字的快速冪是一樣的,演算法如下,有兩種方法,分別是迭代和遞迴。

//! solve base^n

template t fast_pow_iterate(t base, int n)

return r;

}//! solve base^n

template t fast_pow_recursion(t base, int n)

#pragma once

class fibonacci

}~fibonacci(){};

void reset_fib(int n_)

int get_cur()

int get_pre()

int get_next()

private:

int fibn; //record n

int cur;

int pre;

};

斐波那契數

入門訓練 fibonacci數列 時間限制 1.0s 記憶體限制 256.0mb 問題描述 fibonacci數列的遞推公式為 fn fn 1 fn 2,其中f1 f2 1。當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。輸入格式 輸入包含乙個整數n。輸出格式 輸出一行,...

斐波那契數

斐波那契數列 fibonacci sequence 簡介 斐波那契數列 fibonacci sequence 又稱 分割 數列 因 數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 ...

斐波那契數

遞迴演算法是不可取的。由於效率非常低,並且還有棧溢位的風險。應該使用例如以下的迭代解法 int fibonacci unsigned int n if n 1 int i 0,j 1,m unsigned int k for k 2 k n k return m 可是對於這題來說。上面的 還是不行的...