本系列演算法實現都是在學習資料結構(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 可是對於這題來說。上面的 還是不行的...