無窮數列1,1,2,3,5,8,13,21,34,55…稱為fibonacci數列,它可以遞迴地定義為
f(n)=1 ………..(n=1或n=2)
f(n)=f(n-1)+f(n-2)…..(n>2)
求第n個fibonacci數。
分析f(n)=f(n-1)+f(n-2)…..(n>2),應該使用遞迴演算法。
遞迴演算法是將問題分解為規模變小了的同類子問題,然後呼叫遞迴函式求解,遞迴函式是直接或間接呼叫其自身。
所以遞迴問題需要乙個函式來反覆呼叫自身,**如下
int f(int
x)int main()
}
算n=30左右的fibonacci數還是很快的,但是到40時速度就非常的慢了。
其原因是在f(x)中return f(x-1)+f(x-2); 因為沒有記錄已經計算過的f(x-1)和f(x-2)的值,每次呼叫f(x)都需要從新分解到f(1)+f(2)從新計算,數字越大,分解的越深,優化後的**如下:
long record[100] = ;
long
long f(long x)
return lzx[x];
}int main()
}
優化的**增加了record[100],每次計算f(x)時都記錄此時f(x)的值,如果再次計算到這裡則直接返回record[x]的值,不用從新計算到f(1)+f(2),並且使用長整形。經過優化可以計算n=100的fibonacci數。但是另乙個問題是使用printf(「%???」,c);時沒沒找到適當的%?。 ACM基礎學習 1 3
時間限制 1 sec 記憶體限制 128 mb 提交 665 解決 270 提交 狀態 討論版 命題人 外部匯入 所謂no.1,就是所有成績都排在第一的同學,我們假設每個人只有理科,文科,體育這三門課。我們現在假設某門成績並列第一,並列的人都是這門功課第一名,並且保證資料不會出現2個no.1 現給定...
acm學習筆記
include include include int main 在乙個平面內有兩個點,求兩個點分別和原點的連線的夾角的大小。include include define pi 3.1415926 int main return 0 用迭代法求平方根。求平方根的迭代公式為 x n 1 1 2 x n...
Effective C 學習筆記 (13)
由於在寫 時很多時候需要用到資源,比如new乙個物件之類的,這樣一來資源的申請和釋放需要程式設計師自己完成,對 的邏輯需要謹慎設計,才能保證資源不會洩漏。其實這類似的程式設計風格,在之前寫c的時候也有編碼規範來規定資源的釋放,比如do while的運用啊,goto exit0之類的方法,但是對於c ...