蒟蒻說演算法 遞迴

2021-10-03 06:56:11 字數 1679 閱讀 5938

想要表情包嗎?我可以給你,請看下面。

呵呵~今天不發題解,讓我們來談談演算法。這此提到的演算法是非常的常見,這一次的演算法就是——遞迴

遞迴的原理

想要了解遞迴,就必須要了解一下遞迴的工作原理,才能成功的使用。遞迴的本質就是遞迴函式呼叫自身。可以粗略的理解為無限製造for巢狀,是不是很簡單 ??然後我們要知道遞迴是把呼叫的遞迴函式全部丟到乙個棧裡面,再乙個乙個去處理。so easy~

遞迴函式的框架

框架並不難,跟函式很像,看一下下面的**框架:

#include

using

namespace std;

void

/*函式型別,就是int,bool,void之類的*/ fill/*函式名*/

(/*需要的引數*/

)/*其它烏七八糟的**,中間一定要出現呼叫自身函式,不然就不是遞迴啦*/

}int

main()

其它的自己編碼,就是開頭的if絕對不能漏哦,漏了的話,呵呵呵~ 你可以試試,肯定會一直呼叫呼叫再呼叫,只要你不return的話。

使用遞迴的題目

#include

using

namespace std;

intf

(int num)

else

}int

main()

挺精簡的吧,簡單的作者都沒什麼注釋可寫的了。只要你試試,40左右就**了(超時)

你只要輸出一下每次呼叫的是數列中的第幾項,就會得到一下結果(n = 7)的時候是這樣的:

顯而易見,第五項被重複了兩遍,第四項被重複了3遍,是不是很驚喜?如果資料大一點,再大一點的話,就會重複計算很多遍,導致大量時間浪費,所以超時不是事。所以優化就是必須的了。

遞迴優化

遞迴的優化作者知道一種,叫做記憶化搜尋,用人話來說就是每次要計算時就先找一下在結果陣列中有沒有,有的話直接使用,沒有的話先算出結果,存到結果資料裡面,方便下一次呼叫。只不過有乙個要注意的東西就是使用是要先盡量的減少引數,不然的話你就有可能使用三維陣列甚至四維。再說了,引數那麼多,也不容易命中,是吧。給大家看一下優化後的**:

#include

using

namespace std;

int result[

100]

;intf(

int num)

else

else

return result[num]

;//前兩項之和}}

intmain()

執行結果是這樣的:

是吧?這樣就快很多了吧?用檔案輸入的話n = 40都只要0.5632s就ok了,上面那個作者中間10輸錯了,耗掉了時間,總體來說是快了很多了。

遞迴就講完了,不會太難吧。

蒟蒻複習之 Floyd

暴力無解演算法 入門必備 然而我發現這個簡單的演算法還有很多用法 作為複習篇不講原理 圖的要求 既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環 複雜度為o n 3 原理 dp思路 f i j f i k f k j void floyd 注意 1應對所建的圖進行初始化如下 void i...

蒟蒻複習之 SPFA,dijkstra

蒟蒻複習之 spfa,dijkstra 好把這個太簡單了 作為複習篇不講原理 dijkstra 表示很少用,即使他要比spfa穩定 附贈 模版題 include include include includeusing namespace std const int maxn 500000 100 ...

蒟蒻複習之 Tarjan

蒟蒻複習之 tarjan 強連通圖的判斷方法 作為複習篇不講原理 noip2015 資訊傳遞 就是找乙個最小環 標準的模板題 雖然有很多解法 include include include includeusing namespace std const int maxn 200000 100 in...