首頁(yè) - 網(wǎng)校 - 萬(wàn)題庫(kù) - 直播 - 雄鷹網(wǎng)校 - 團(tuán)購(gòu) - 書(shū)城 - �?� - 學(xué)習(xí)通 - 導(dǎo)航 -
首頁(yè)網(wǎng)校萬(wàn)題庫(kù)直播雄鷹網(wǎng)校團(tuán)購(gòu)書(shū)城模考論壇實(shí)用文檔作文大全寶寶起名
2015中考
法律碩士
2015高考
MBA考試
2015考研
MPA考試
在職研
中科院
考研培訓(xùn)
專(zhuān)升本
自學(xué)考試 成人高考
四 六 級(jí)
GRE考試
攻碩英語(yǔ)
零起點(diǎn)日語(yǔ)
職稱(chēng)英語(yǔ)
口譯筆譯
申碩英語(yǔ)
零起點(diǎn)韓語(yǔ)
商務(wù)英語(yǔ)
日語(yǔ)等級(jí)
GMAT考試
公共英語(yǔ)
職稱(chēng)日語(yǔ)
新概念英語(yǔ)
專(zhuān)四專(zhuān)八
博思考試
零起點(diǎn)英語(yǔ)
托福考試
托業(yè)考試
零起點(diǎn)法語(yǔ)
雅思考試
成人英語(yǔ)三級(jí)
零起點(diǎn)德語(yǔ)
等級(jí)考試
華為認(rèn)證
水平考試
Java認(rèn)證
職稱(chēng)計(jì)算機(jī) 微軟認(rèn)證 思科認(rèn)證 Oracle認(rèn)證 Linux認(rèn)證
公 務(wù) 員
導(dǎo)游考試
物 流 師
出版資格
單 證 員
報(bào) 關(guān) 員
外 銷(xiāo) 員
價(jià)格鑒證
網(wǎng)絡(luò)編輯
駕 駛 員
報(bào)檢員
法律顧問(wèn)
管理咨詢(xún)
企業(yè)培訓(xùn)
社會(huì)工作者
銀行從業(yè)
教師資格
營(yíng)養(yǎng)師
保險(xiǎn)從業(yè)
普 通 話(huà)
證券從業(yè)
跟 單 員
秘書(shū)資格
電子商務(wù)
期貨考試
國(guó)際商務(wù)
心理咨詢(xún)
營(yíng) 銷(xiāo) 師
司法考試
國(guó)際貨運(yùn)代理人
人力資源管理師
廣告師職業(yè)水平
衛(wèi)生資格 執(zhí)業(yè)醫(yī)師 執(zhí)業(yè)藥師 執(zhí)業(yè)護(hù)士
會(huì)計(jì)從業(yè)資格
基金從業(yè)資格
統(tǒng)計(jì)從業(yè)資格
經(jīng)濟(jì)師
精算師
統(tǒng)計(jì)師
會(huì)計(jì)職稱(chēng)
法律顧問(wèn)
ACCA考試
初級(jí)會(huì)計(jì)職稱(chēng)
資產(chǎn)評(píng)估師
高級(jí)經(jīng)濟(jì)師
注冊(cè)會(huì)計(jì)師
高級(jí)會(huì)計(jì)師
美國(guó)注冊(cè)會(huì)計(jì)師
審計(jì)師考試
國(guó)際內(nèi)審師
注冊(cè)稅務(wù)師
理財(cái)規(guī)劃師
一級(jí)建造師
安全工程師
設(shè)備監(jiān)理師
公路監(jiān)理師
公路造價(jià)師
二級(jí)建造師
招標(biāo)師考試
物業(yè)管理師
電氣工程師
建筑師考試
造價(jià)工程師
注冊(cè)測(cè)繪師
質(zhì)量工程師
巖土工程師
注冊(cè)給排水
造價(jià)員考試
注冊(cè)計(jì)量師
環(huán)保工程師
化工工程師
暖通工程師
咨詢(xún)工程師
結(jié)構(gòu)工程師
城市規(guī)劃師
材料員考試
消防工程師
監(jiān)理工程師
房地產(chǎn)估價(jià)
土地估價(jià)師
安全評(píng)價(jià)師
房地產(chǎn)經(jīng)紀(jì)人
投資項(xiàng)目管理師
環(huán)境影響評(píng)價(jià)師
土地登記代理人
寶寶起名
繽紛校園
實(shí)用文檔
入黨申請(qǐng)
英語(yǔ)學(xué)習(xí)
思想?yún)R報(bào)
作文大全
工作總結(jié)
求職招聘 論文下載 直播課堂
您現(xiàn)在的位置: 考試吧 > 軟件水平考試 > 復(fù)習(xí)資料 > 程序員 > 正文

2015年軟件水平考試程序員精選題(6)

考試吧整理“2015年軟件水平考試程序員精選題(6)”供考生參考,更多軟件水平考試資訊和備考資料請(qǐng)關(guān)注考試吧軟件水平考試網(wǎng)。

  O(logn)求Fibonacci數(shù)列

  題目:定義Fibonacci數(shù)列如下:

  / 0 n=0

  f(n)= 1 n=1

  \ f(n-1)+f(n-2) n=2

  輸入n,用最快的方法求該數(shù)列的第n項(xiàng)。

  分析:在很多C語(yǔ)言教科書(shū)中講到遞歸函數(shù)的時(shí)候,都會(huì)用Fibonacci作為例子。因此很多程序員對(duì)這道題的遞歸解法非常熟悉,看到題目就能寫(xiě)出如下的遞歸求解的代碼。

  ///////////////////////////////////////////////////////////////////////

  // Calculate the nth item of Fibonacci Series recursively

  ///////////////////////////////////////////////////////////////////////

  long long Fibonacci_Solution1(unsigned int n)

  {

  int result[2] = {0, 1};

  if(n < 2)

  return result[n];

  return Fibonacci_Solution1(n - 1) + Fibonacci_Solution1(n - 2);

  }

  但是,教科書(shū)上反復(fù)用這個(gè)題目來(lái)講解遞歸函數(shù),并不能說(shuō)明遞歸解法最適合這道題目。我們以求解f(10)作為例子來(lái)分析遞歸求解的過(guò)程。要求得f(10),需要求得f(9)和f(8)。同樣,要求得f(9),要先求得f(8)和f(7)……我們用樹(shù)形結(jié)構(gòu)來(lái)表示這種依賴(lài)關(guān)系

  f(10)

  / \

  f(9) f(8)

  / \ / \

  f(8) f(7) f(6) f(5)

  / \ / \

  f(7) f(6) f(6) f(5)

  我們不難發(fā)現(xiàn)在這棵樹(shù)中有很多結(jié)點(diǎn)會(huì)重復(fù)的,而且重復(fù)的結(jié)點(diǎn)數(shù)會(huì)隨著n的增大而急劇增加。這意味這計(jì)算量會(huì)隨著n的增大而急劇增大。事實(shí)上,用遞歸方法計(jì)算的時(shí)間復(fù)雜度是以n的指數(shù)的方式遞增的。大家可以求Fibonacci的第100項(xiàng)試試,感受一下這樣遞歸會(huì)慢到什么程度。在我的機(jī)器上,連續(xù)運(yùn)行了一個(gè)多小時(shí)也沒(méi)有出來(lái)結(jié)果。

  其實(shí)改進(jìn)的方法并不復(fù)雜。上述方法之所以慢是因?yàn)橹貜?fù)的計(jì)算太多,只要避免重復(fù)計(jì)算就行了。比如我們可以把已經(jīng)得到的數(shù)列中間項(xiàng)保存起來(lái),如果下次需要計(jì)算的時(shí)候我們先查找一下,如果前面已經(jīng)計(jì)算過(guò)了就不用再次計(jì)算了。

  更簡(jiǎn)單的辦法是從下往上計(jì)算,首先根據(jù)f(0)和f(1)算出f(2),在根據(jù)f(1)和f(2)算出f(3)……依此類(lèi)推就可以算出第n項(xiàng)了。很容易理解,這種思路的時(shí)間復(fù)雜度是O(n)。

  ///////////////////////////////////////////////////////////////////////

  // Calculate the nth item of Fibonacci Series iteratively

  ///////////////////////////////////////////////////////////////////////

  long long Fibonacci_Solution2(unsigned n)

  {

  int result[2] = {0, 1};

  if(n < 2)

  return result[n];

  long long fibNMinusOne = 1;

  long long fibNMinusTwo = 0;

  long long fibN = 0;

  for(unsigned int i = 2; i <= n; ++ i)

  {

  fibN = fibNMinusOne + fibNMinusTwo;

  fibNMinusTwo = fibNMinusOne;

  fibNMinusOne = fibN;

  }

  return fibN;

  }

  這還不是最快的方法。下面介紹一種時(shí)間復(fù)雜度是O(logn)的方法。在介紹這種方法之前,先介紹一個(gè)數(shù)學(xué)公式:

  {f(n), f(n-1), f(n-1), f(n-2)} ={1, 1, 1,0}n-1

  (注:{f(n+1), f(n), f(n), f(n-1)}表示一個(gè)矩陣。在矩陣中第一行第一列是f(n+1),第一行第二列是f(n),第二行第一列是f(n),第二行第二列是f(n-1)。)

  有了這個(gè)公式,要求得f(n),我們只需要求得矩陣{1, 1, 1,0}的n-1次方,因?yàn)榫仃噞1, 1, 1,0}的n-1次方的結(jié)果的第一行第一列就是f(n)。這個(gè)數(shù)學(xué)公式用數(shù)學(xué)歸納法不難證明。感興趣的朋友不妨自己證明一下。

  相關(guān)推薦:

  2015年軟考信息技術(shù)處理員考前知識(shí)點(diǎn)總結(jié)匯總

  2015年軟件水平考試《程序員》提高練習(xí)題匯總

  2015軟件水平考試《程序員》知識(shí)點(diǎn)總結(jié)匯總

文章搜索
軟件水平考試欄目導(dǎo)航
版權(quán)聲明:如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請(qǐng)注明出處。
Copyright © 2004-2025 考試吧軟件水平考試網(wǎng) All Rights Reserved  
中國(guó)科學(xué)院研究生院權(quán)威支持(北京)
在線(xiàn)模擬試題
考證通關(guān)殺器
考試最新資訊
學(xué)
一次通關(guān)技巧