斐波那契數
斐波那契數形如:0,1,1,2,3,5,8,13.....。該序列的通用方程式:fib(n)=fib(n-1)+fib(n-2),遞迴生成斐波那契數的典型函式如下:
unsigned recursivefib( unsigned n)
這個程式的時間複雜度是指數級的,它非常低下,根本不能應用於產品中。
但是距離模板化版本只有一步之遙。
template< unsigned n> struct fib;};
//模板特化,結束條件
template <> struct fib <0> ; };
template <> struct fib <1> ; };
//讓該模板形如函式
#define fibt( n ) fib< n >::val
通過#define「呼叫」此模板:
std::cout<< fibt( 4 ); //fib< 4 >::val
此模板化版本有幾個注意點:
1.此模板數不是真正的函式-----它是叫做val的列舉型別,在編譯期遞迴生成,
val=fib< n-1 >::val+fib< n-2 >::val並不常見,但是合法。
2.模板引數n用於指定函式的輸入,並不常見,但完全可行。
3.要終止遞迴,需要正確處理結束條件,對斐波那契數來說,結束條件是n為0和1時,
本模板中使用的是模板特化。
4.如果當i還是可變的變數時呼叫fibt(i),將會產生編譯錯誤。
=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由於所有的輸入在編譯器都確定了,所以編譯程式可以將fib< n >換算成常數。
std::cout<< fibt( 4 );//與3完全等價
該方法可以成為你c++工具包中的有用工具,你很可能會有指數級執行時間不能降為零的情況,通過使用模板元程式設計,就可以通過增加額外的編譯時間來減少執行時間。
C Ado 在編譯的時候,報錯。
其中錯誤提示如下 fatal error c1083 cannot open type library file c program files common files system ado msjro.dll no such file or directory 1 首先確定在標頭檔案ado2.h...
static assert 是在編譯時期的斷言
static assertion static assert 是在編譯時期的斷言,作用不言而喻的。語法是這樣 static assert bool constexpr string 其中 bool constexpr 常量表示式 string 如果bool constexpr表示式為false,這個...
Magic Number 在程式設計中的使用
magic no,好方法!假設我們有了一大塊緩衝區 以下稱buffer say,1m,這一塊緩衝區將用來滿足很多小的順序到來的記憶體請求,並且,其釋放先後次序和申請次序一致。我們可以考慮採用環形佇列來解決這個問題。為了記錄分配出去的記憶體塊 以下稱buflet 的大小 狀態等資訊,需要對記憶體區進行...