close
標題:

c費式數列解f(12)??

 

此文章來自奇摩知識+如有不便請留言告知

發問:

int f(int n) { return ((n<=1)?1:(f(n-1)+f(n-2))); } Q1:請問當n=12時 return=?? A1:233 Q2:the number of calls on f to compute f(12) is?? A2:465 好絕情的一題~ 請各位幫幫我吧 請記得寫下清楚的過程喔 3Q

最佳解答:

哇~要解釋過程就會超辛苦了 這是題目中出現的語法: 條件?敘述1:敘述2; 如果條件是真的,就採用敘述1,不然就採用敘述2 在這個例子條件是n>=1, 所以n=2,3,4,5,...的時候條件會是假的,就採用敘述2 要是代入n=2, 條件為假,所以採用敘述2,也就是冒號後面的那個 所以電腦會去計算f(n-1)+f(n-2) 在這裡n=2, 所以電腦要算的是f(1)+f(0) f(1)就是1,因為當n=1,條件成立,所以採用敘述1 f(0)在這條式子中也變成1,因為條件n<=1還是成立, 所以f(2)=f(1)+f(0)=2,雖然跟數學上的不一樣,但是就先照著他說的算吧= = ================================================= 第一題其實就是問f(12)是多少 這題用手寫就好 因為f(1)=1,f(2)=2,所以 1,2,3,5,8,13,21,34,55,89,144,233 f(12)=233 討論細節: 要求f(12),n=12,條件不成立,所以f(12)=f(11)+f(10) f(11)=f(10)+f(9) f(10)=f(9)+f(8) ........ 要是全部打上來你會煩死 簡單來說,""遞迴演算法""就像IE7或IE8的分頁一樣, 每個分頁要做的事就是算出f(n), 要是n>1就再開一個新分頁, 然後自己就發呆等答案 比方說,要是你呼叫f(12) 喔,就開一個分頁啦。 這個分頁會計算f(12)=f(11)+f(10) 但是這兩個數字他都不知道,所以他就再呼叫兩個分頁 一個算f(11),另一個算f(10) 然後他就發呆,等到這兩個數字都回來了以後,他就把他們加起來, 然後傳回去。 return就是回傳的意思,傳回哪裡? 誰呼叫它它就傳回哪裡,工作完成以後它就自己關掉。 開了一大堆分頁以後就會算出f(12)=233。 ================================================ 第2題在問什麼呢?他在問""要算出f(12)一共呼叫了幾次?"" 也就是總共開過幾個分頁啦。 讓我們來計算一下: 要算出f(0)共需要1個分頁 f(1)要1個。 f(2)要3個,因為你要先呼叫f(2)[一個],f(2)再呼叫f(1)和f(0) 所以共3個。 f(3)要5個,因為呼叫f(3)[一個],f(3)呼叫f(2)和f(1),f(2)要3個,f(1)要一個 總共5個。 所以歸納出數學式: 分頁數T(n)=T(n-1)+T(n-2)+1,最後那個1是呼叫T(n)時用的。 所以列出數列: 1,3,5,9,15,25,41,67,109,177,287,465 所以要算出f(12)需要開465個分頁。 極限的沒效率,這麼多分頁當中其實有452個是和其他分頁重複的。 每開一個分頁,就會先宣告一個變數n,用來接別人丟下來的資料。 1個整數4個bytes(dev c++),465個分頁就直接吃掉1860個bytes。 資料量小一點還好,輸入大一點的n就會爆掉了。 詳細的遞迴過程你可以畫出一點點的樹狀圖來觀察, 不用畫完啦,465個會畫到爛掉= = 2010-08-07 13:57:18 補充: 奇怪?為什麼名字變了啊= =

其他解答:6FE1C1721610E824
arrow
arrow

    yffuhxy 發表在 痞客邦 留言(0) 人氣()