趣說遞迴演算法

2021-10-01 22:47:24 字數 1905 閱讀 2379

先宣告一下,不涉及**,我們就簡單聊聊而已。

一、什麼是遞迴?

先來說說乙個場景,小學那會,要是遇到乙個不懂的漢字,我翻看了新華字典去查閱,可是在查閱的時候又遇到不懂的漢字,又繼續查…直到查詢自己懂的為止,於是遞推回來,之前首個不懂的漢字就明白了。

你可能會說,要是一直都是不懂漢字怎麼辦,或者查了一圈之後又跟第乙個漢字連線起來,那就陷入死迴圈了。

很好,帶著你的困惑往下看。

遞迴:

你開啟面前這扇門,看到屋裡面還有一扇門。你走過去,發現手中的鑰匙還可以開啟它,你推開門,發現裡面還有一扇門,你繼續開啟它。

若干次之後,你開啟面前的門後,發現只有一間屋子,沒有門了。然後,你開始原路返回,每走回一間屋子,你數一次,走到入口的時候,你可以回答出你到底用這你把鑰匙開啟了幾扇門。

迴圈:

你開啟面前這扇門,看到屋裡面還有一扇門。你走過去,發現手中的鑰匙還可以開啟它,你推開門,發現裡面還有一扇門(若前面兩扇門都一樣,那麼這扇門和前兩扇門也一樣;

如果第二扇門比第一扇門小,那麼這扇門也比第二扇門小,你繼續開啟這扇門,一直這樣繼續下去直到開啟所有的門。

但是,入口處的人始終等不到你回去告訴他答案。你看出遞迴與迴圈的區別了?

二、為什麼使用遞迴?遞迴的優缺點?

1.優點:**的表達力很強,寫起來簡潔。

2.缺點:空間複雜度高、有堆疊溢位風險、存在重複計算、過多的函式呼叫會耗時較多等問題。

三、什麼樣的問題可以用遞迴解決呢?

乙個問題只要同時滿足以下3個條件,就可以用遞迴來解決:

1.問題的解可以分解為幾個子問題的解。何為子問題?就是資料規模更小的問題。

2.問題與子問題,除了資料規模不同,求解思路完全一樣

3.存在遞迴終止條件

類似上面的例子,當開啟門後走到路的盡頭,這就是臨界值。當走到門的盡頭後,就原路返回了。這就遞迴,一去一回。

這張圖的 終止條件就是找到「我的小魚幹」

四、如何實現遞迴?

1.遞迴**編寫

寫遞迴**的關鍵就是找到如何將大問題分解為小問題的規律,並且基於此寫出遞推公式,然後再推敲終止條件,最後將遞推公式和終止條件翻譯成**。

2.遞迴**理解

如果乙個問題a可以分解為若干個子問題b、c、d,你可以假設子問題b、c、d已經解決。而且,你只需要思考問題a與子問題b、c、d兩層之間的關係即可,不需要一層層往下思考子問題與子子問題,子子問題與子子子問題之間的關係。

遮蔽掉遞迴細節,這樣子理解起來就簡單多了。因此,理解遞迴**,就把它抽象成乙個遞推公式,不用想一層層的呼叫關係,不要試圖用人腦去分解遞迴的每個步驟。

五、遞迴常見問題及解決方案

1.警惕堆疊溢位:可以宣告乙個全域性變數來控制遞迴的深度,從而避免堆疊溢位。

2.警惕重複計算:通過某種資料結構來儲存已經求解過的值,從而避免重複計算。

遞迴,你理解了麼?

參考:《資料結構與演算法之美》

知乎-遞迴

蒟蒻說演算法 遞迴

想要表情包嗎?我可以給你,請看下面。呵呵 今天不發題解,讓我們來談談演算法。這此提到的演算法是非常的常見,這一次的演算法就是 遞迴。遞迴的原理 想要了解遞迴,就必須要了解一下遞迴的工作原理,才能成功的使用。遞迴的本質就是遞迴函式呼叫自身。可以粗略的理解為無限製造for巢狀,是不是很簡單 然後我們要知...

趣說位元幣基本概念

相信現在很多持有位元幣的玩家都不一定知道位元幣到底是個什麼,都是跟著投資風頭,像模像樣的弄個錢包,在交易平台入手一些位元幣,必要的時候做乙個提現操作。其實,這些操作都不是位元幣當初的樣子,資金和人力的入場,把很多位元幣網路原本不親民的東西,變得更符合人機互動了。接下來,我隨便將幾個位元幣的基本概念。...

趣說API HTTP 狀態碼的使用

在設計api http 狀態碼的時候,我們總能聽到兩種聲音 第一種,也是大家最常用的 所有介面的狀態碼都返回200,然後在自定義錯誤碼 正確響應 錯誤響應 另一種,rest api,僅使用http狀態 正確響應 錯誤響應 更多的錯誤碼規範可以直接從 http status code 檢視。為什麼說是...