斐波納契數列不同實現比較

2021-06-19 13:34:01 字數 1468 閱讀 7309

斐波納契數列形如:0,1,2,3,5,8,13,....。該序列的通用方程是:fib(n)=fib(n-1)+fib(n-2).

1.使用遞迴

unsigned recursivefib(unsigned n)

eg:recursivefib(0xff); 信不信由你,這個簡單函式的時間複雜度是指數級的,它非常低效。

2.使用迴圈

unsigned recursivefib(unsigned n)

return f;

}

eg:recursivefib(0xffffff);解決了1中低效的問題。

3.使用模板函式

templatestruct fib;};

template <> struct fib<0> ;};

template <> struct fib<1> ;};

#define recursivefib3(n) fib::val

eg:recursivefib(4);

關於此模板化版本需要注意以下幾點:

.模板函式並不是真正的函式--它是叫作val的列舉整數,在編譯期遞迴生成。語句val = fib::val + fib::val不常見,但是合法。

.fib被定義為結構,以簡化標記。在預設情況下結構資料是公用的,這也正是我們所需要的。

.模板引數n用於指定函式的輸入。這種模板引數的使用並不常見,但完全可行。例數,std::bitset用n的數值作為它的模板引數來定義表示位域的位數。數字引數必須在編譯期被獲知,如果當i還是可變的變數時呼叫recursivefib(i),則會產生編譯錯誤。

.要中止遞迴,需要正確地處理結束條件。對於斐波納契數來說,結束條件就是當n為0和1時。在模板中處理基本情況的方法是使用模板特化。標記了template<>的,表示為模板特化。當n為0和1時,val=n.

分析編譯程式如何計算recursivefib(4):

=fib<4>::val

=fib<3>::val + fib<2>::val

=fib<2>::val + fib<1>::val + fib<1>::val + fib<0>::val

=fib<1>::val + fib<0>::val + 1 + 1 + 0

=1 + 0 + 1 + 1 + 0

=3

由於所有的輸入在編譯期都確定了,所以編譯程式可以將recursivefib(n)換算為常量。換句話來說,編譯程式可以生成與以下完全等價的**:

std::cout<<3;//std::cout《該方法可以成為你c++工具包中有用工具。你很可能會有指數級執行時間不能降為常數級執行時間的情況,通過使用模板無程式設計,就可以通過增加額外的編譯時間來降低程式的執行時間。對於遊戲來說,執行時間通常比編譯時間更重要,所以這項技術也將非常有用。

斐波納契數列

f 1 0 f 2 1 f n f n 1 f n 2 斐波納契數列決定審美和諧性 800年前,義大利的數學家李奧納多 斐波那契出版了驚世之作 算盤書 在 算盤書 裡,斐波納契提出了著名的 兔子生兔子的問題 有乙個人把一對兔 子放在四面圍著的地方。假定每個月一對兔子生下另外一對。而這新的一對在二個月...

斐波納契數列

斐波納契數列又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 此本章通過多種方式實現斐波納契數列 第一種 for 迴圈實現 a,b 0,1 for i in ...

python斐波納契數列

fibonacci series 斐波納契數列 兩個元素的總和確定了下乙個數 a,b 0,1 while b 10 print b a,b b,a b fibonacci series 斐波納契數列 兩個元素的總和確定了下乙個數 a,b 0,1 while b 1000 if a b 1000 pr...