1.問題描述:
(1)乙隻青蛙一次可以跳上1 級台階,也可以跳上2 級。求該青蛙跳上乙個n 級的台階總共有多少種跳法。
(2)乙隻青蛙一次可以跳上1級台階,也可以跳上2 級……它也可以跳上n 級,此時該青蛙跳上乙個n級的台階總共有多少種跳法?
2.遞迴:
在遞迴裡面,乙個子程式自己負責解決摸個問題的一小部分,他還把問題分解成很多的小塊,然後呼叫自己來分別解決每一小塊。當問題的小部分很容易解決,而問題的大部分也很容易分解成眾多的小部分時,常常會用到遞迴。
遞迴並不常用,但如果使用得謹慎,還是可以得到非常優雅的解。他的思考方式是:要解決這個大問題,先解決小問題,小問題和大問題是一類問題,只是規模不一樣而已。
按照這個思維方式,你可能很快就寫出乙個簡潔的程式。每當我們對自己新想出來的遞迴演算法自我陶醉的時候,是否想過還有更加高效的演算法?
3.迭代:
如果我們的思考方式是:先解決小問題,再解決大問題,每前進一步,規模大的就被解決一點……
這就是迭代法,根據小規模算出大規模,在算出更大規模,知道算出我們要求的問題規模。
4.還有更好的嗎?
其實大多數遞迴或迭代的問題都能轉化為非遞迴演算法。更厲害的演算法複雜度可以降到o(1)。
毋庸置疑,第乙個不就是斐波那契數列麼。除了遞迴和迭代這種效能一般的方法,還能怎麼解決?其實很多遞推公式都可以解成關於n的函式,這個在組合數學這門課中會詳細介紹。
附上上面兩個問題的**:
double fib(int n)
double nb_fib(int n)
所以以後在遇到遞迴和迭代的時候,看看能不能轉化成非遞迴演算法!
遞迴快還是迴圈(迭代)快?
1.演算法抽象上所謂的迴圈 更準確點說,叫做迭代 順便,c艹有的是 迭代語句 而不是 迴圈語句 是遞迴的特例。寫成迴圈的東西能直接轉寫成遞迴形式,反過來就得自己造活動記錄了 例如棧 2.遞迴呼叫需要維護活動記錄,而迭代直接復用了儲存,可以省略這些開銷,所以體系結構若執行顯式遞迴呼叫一般更慢。但這裡一...
遞迴和迭代 迭代與遞迴
很多程式設計小白都會遇到 迭代 和 遞迴 的問題 包括我自己 大部分同學還是不知道迭代與遞迴的區別。下面我就嘗試用最通俗易懂的模式講解遞迴與迭代的區別。1.迭代 迭代其實很簡單,我們在程式設計中經常用到迭代。比如說 i 1 print i 這個就是乙個迭代,沒想到吧。迭代的意思其實就是在迴圈 現了參...
遞迴與迭代
遞迴與迭代都是基於控制結構 迭代用重複結構,而遞迴用選擇結構。遞迴與迭代都涉及重複 迭代顯式使用重複結構,而遞迴通過重複函式呼叫實現重複。遞迴與迭代都涉及終止測試 迭代在迴圈條件失敗時終止,遞迴在遇到基本情況時終止。使用計數器控制重複的迭代和遞迴都逐漸到達終止點 迭代一直修改計數器,直到計數器值使迴...