斐波那契數列的每一項f(n),計算出f(n)剛開到這道題,哇,太簡單了吧,有個遞迴就可以搞定斐波那契數列啦,於是寫了乙個簡單的遞迴實現的斐波那契數列演算法:
int fib(int n)
else
}
試著執行了一下,當n的值大於40時,執行速度就慢了很多了,試想一下距離int所能表示的最大值2^31-1還遠著呢,看來用遞迴是不可行的。
接下來想了想,既然遞迴能夠實現,那迴圈肯定也是實現斐波那契數列的啦~~
int f1(int n)
if(n%2==0)
return b;
else
return a;
}果然不出所料,迴圈實現的這個演算法比遞迴真的要快上n倍,而且n值能夠取得最大值是依賴於int能夠表示的範圍的,超出了int表示範圍就變成負數了。n=46時,是int能夠表示的最大的斐波那契值了。
其實這道題用迴圈就可以解出來了,不過對於執行速度還是有要求的話,我們就可以直接用斐波那契數列的通項公式算出具體的某個值。通項為f(n)=(1/√5)*(√5表示根號5)
int f2(int n)
這個演算法當然就更快了,都不用遞迴或迴圈,只要輸入乙個n值就可以直接算出來了,數學公式果然是強大的解題工具。
這道題的解題過程如下:
int f2(int n)
int main()
cout《結果n=46
現在算一下這幾個演算法執行的時間長短:
在網上搜了個比較精確的計數器程式:
double gettime2() //使用高精度計時器
queryperformancecounter( &performancecount );
t=(double)performancecount.quadpart / (double)s_freq.quadpart;
return t;
}測量程式如下:
int main()
執行結果如下:
fib(n)遞迴:0.722634
f1(n)迴圈:7.82222e-006
f2(n)公式:3.35238e-006
從上面的執行時間可以看出來,遞迴實在是太慢了,公式法的速度優於迴圈,不過迴圈也比遞迴快很多了,都不是乙個數量級的差別了~~
筆試題一 解答
這個題目是在裡面找到的,是乙個帖子,檢視了跟帖的大牛們的答覆,自己也簡單想了一下,如果我們只考慮兩類表均在乙個伺服器上儲存著,那麼我覺得最好的方法應該就是建乙個臨時表,將第2類表中的30張表的userid去重的插入到臨時表中,然後將第一類資料表與該臨時表進行比較,就可以 這樣算是以空間換取時間吧!這...
微軟2014筆試題21題解答(有點挫)
題目如上圖所示。這裡給出兩種解法 第一種是自己想的,時間複雜度o n 2 第二種方法實現的是實驗室乙個大牛的想法,時間複雜度o n 如下 void reorder1 node root changetimes sum 2 if sum 0x01 insert num changetimes stop...
騰訊筆試題解
1,把整數分成256m段,每段可以用64位整數儲存該段資料個數,256m 8 2g記憶體,先清0 2,讀10g整數,把整數對映到256m段中,增加相應段的記數 3,掃瞄256m段的記數,找到中位數的段和中位數的段前面所有段的記數,可以把其他段的記憶體釋放 4,因中位數段的可能整數取值已經比較小 如果...