遞迴回溯相關

2021-10-10 04:49:52 字數 2905 閱讀 5899

1. 何為遞迴?

遞迴,即函式(方法)自己呼叫自己,亦或者稱為套娃。

2. 遞迴的簡單模板

遞迴不能無限的進行,因為遞迴的原理跟棧有關,如果無限的呼叫遞迴就會棧溢位,所以必須在一開始就設定遞迴的終止條件。如下面這樣

public

void

recur

(引數 0

)

但是不能寫成下面這樣

public

void

recur

(引數 0

)

如果是這樣寫就會無限的遞迴下去,最後stackoverflow

3. 遞迴的簡單例子

3.1 階乘

public

intfactorial

(int n)

3.2 斐波那契數列

public

intfibonacci

(int n)

3.3 漢諾塔

public

void

hanoi

(int n,

char x,

char y,

char z)

else

}

4. 適合用遞迴的場合

如果乙個問題可以拆分成更小的子問題,且子問題和原問題有相同的結構,就可以嘗試用遞迴去寫。但是要考慮空間的限制

5. 如何更好的理解遞迴

一開始接觸遞迴總歸會有點懵,因為原來寫的**都是顯式的,你可以跟著**理順下來,或者一步步debug,但是遞迴是隱式的(借助棧)。

以階乘為例來輔助理解,加入要求4的階乘,用上面的程式會是怎樣的流程呢?

f(4)

->4 * f(3)

->4 * (3 * f(2))

->4 * (3 * (2 * f(1)))

->4 * (3 * (2 * 1))

->4 * (3 * 2)

->4 * 6

->24

前面4行表示的是因為沒有觸發終止條件一直向下拆分成更小的子問題的過程,後面的表示觸發終止條件後向上回彈代入的過程。遞迴就是乙個先遞進再回歸的過程。如果想更好的理解遞迴,我的辦法是從遞迴的終止條件向上一級一級的推導,可能會好理解一點。

1. 什麼叫回溯演算法

簡單點來說回溯演算法是一種解決問題的思想,它通常要通過遞迴來實現,所以放在一起複習,而且確實一開始很不好理解,需要多琢磨。

回溯演算法的思路就是暴力求解,不停探索的解決問題思路。從起點出發,先朝著乙個方向走,直到走不通的時候再回退一步重新做選擇。這種走不通就退回再走的思路成為回溯法。結合生活的乙個例子來說,猜乙個一位數的密碼,第一位先猜0,不對就再猜別的1-9,知道猜對。這種不停嘗試的列舉法就是回溯。

2. 回溯演算法例項

力扣78.子集

問題描述:給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。

說明:解集不能包含重複的子集。

示例:輸入: nums = [1,2,3]

輸出:[

[1],

[1,2],

[1,2,3],

[1,3],

[2],

[2,3],

[3],

]

class

solution

/** *param nums:傳入的陣列

*param index:可以理解為層數

*/public

void

dfs(

int[

] nums,

int index)

}}

力扣46.全排列

問題描述:給定乙個沒有重複數字的序列,返回其所有可能的全排列。

示例:輸入: nums = [1,2,3]

輸出:[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1],

]

class

solution

public

void

dfs(

int[

] nums, list

list)}}

}

力扣39.組合總數

問題描述:給定乙個無重複元素的陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。

candidates中的數字可以無限制重複被選取。

示例:輸入: candidates = [2,3,6,7],  target = 7,

所求解集:

[[7],

[2,2,3],

]

class

solution

public

void

dfs(

int[

] nums,

int target, list

list,

int index)

}}

使用with遞迴回溯

向上回溯,查詢頂級部門 declare pdeptid uniqueidentifier with dept deptid,pdeptid as select udepid,uparentid from oa.dbo.depinfo where udepid in select p.udepid f...

遞迴回溯總結

遞迴回溯法對解空間樹作深度優先搜尋,一般情況可表示為 void backtrack int n else 引數n表示遞迴的深度 is ok 表示已經求得問題解 print reult 表示列印結果 如果只求出乙個可行解,那麼求得第乙個問題解後便可exit 如果要求出所有可行解則不需exit base...

遞迴回溯總結

8皇后問題是一道非常經典的題目。題目是說,乙個n n的西洋棋棋盤上主放置n個皇后,使其不能相互攻擊,即任何兩個皇后都不能處在棋盤的同一行,同一列,同一條斜線上,試問共有多少種擺法?其實,題目就是要找出所有的可能情況,然後排除其中不符合條件的情況,剩下的情況即為所要求的。怎麼找出所有的情況呢?對於8皇...