遞迴就是自己呼叫自己的過程(雖然這就話在很多部落格上都這麼說,但我還是要說一遍)。
但是在學習遞迴的過程中,千萬不要像上面這麼理解(ಡωಡ)
因為你會像套娃一樣的套個不停(強迫症(ಡωಡ))
思路一:
所以你要把內部的遞迴理解為呼叫其他的函式,例如:
void
dfs(
int index)
保持這個思路繼續往下:
思路二:
在遞迴的過程中只要考慮特殊的狀態就ok了。其實特殊的狀態只有兩個,那就是
1.中心
2.邊界
中心可以理解為一般的情況
邊界可以理解為特殊的情況
以下的教程都基於這兩個思路來進行
我們通過舉幾個例子講解一下:
1.全排列
將1-9這九個數字進行位數為3的全排列
就像這樣子123、199、927
直接上**(ಡωಡ)
dfs函式是這樣
void
dfs(
int range,
int index,string str)
else
}}
主函式是這樣
int
main()
整體思路:
通過增減字串來達到儲存一次匹配成功的狀態
這個例子是通過遍歷數字的每一位(位數遍歷從後往前,到0時停止)
看到這裡可能會感覺妙(看)不(求)可(不)言(懂),接下來進入正題。
再把上面的**copy一遍(防丟)
void
dfs(
int range,
int index,string str)
else
}}
依據思路二:
這裡的中心是指:
else
}
這裡的邊界是指:
if
(index ==0)
講完了(ಡωಡ)
(ಡωಡ)
接下來講組合
#include
#include
using
namespace std;
int book[
100]
;void
dfs(
int range,
int index,string str)
else}}
}int
main()
看完之後是不是覺得和排列大同小異(ಡωಡ),其實只多了乙個book陣列,用來記錄這個數字每一位的使用情況,如果是1,表示使用過,如果是0,就是沒使用,相當於去掉排列重複的部分
如果你看懂這些之後還有一些技巧
以後補充(ಡωಡ)
DFS的遞迴實現
對乙個例子的理解,以下是關係圖的關係矩陣,求從1開始能到哪個數 include include e include include using namespace std intconst n 5 int maze n n int visit n 1 迴圈的思路 用遞迴,一旦有更深的點就產生新的迴圈...
深度優先dfs
之所以總結一下dfs,是因為刷python題目時候遇到乙個題,單詞搜尋問題,類似於dfs思想的題目,不太會做,然後就總結一下。準備pat!depth first search英文的縮寫,翻譯過來就是 深度優先搜尋 深度優先遍歷的主要思想就是 首先以乙個未被訪問過的頂點作為起始頂點,沿當前頂點的邊走到...
遞迴演算法的講解
在正式介紹遞迴之前,我們首先引用知乎使用者李繼剛 對遞迴和迴圈的生動解釋 遞迴 你開啟面前這扇門,看到屋裡面還有一扇門。你走過去,發現手中的鑰匙還可以開啟它,你推開門,發現裡面還有一扇門,你繼續開啟它。若干次之後,你開啟面前的門後,發現只有一間屋子,沒有門了。然後,你開始原路返回,每走回一間屋子,你...