回溯和递归的区别(简述)
回溯和遞歸的區別(簡述)
- 前言
- 遞歸和回溯
- 最后
前言
最近在LeetCode上刷題刷到了遞歸實現的回溯算法,產生疑惑:這兩者有什么區別呢?在網絡上閱讀了一些相關的文章,總結了一些:
遞歸和回溯
遞歸:遞歸(recursion)是一種算法,在函數中調用自身的方法稱為遞歸。
如果我們要構造某一個狀態A,需要得到它的子狀態B,構造子狀態B需要B的子狀態C,直到最深層的子狀態N(最小子狀態)被構造。
假設子狀態C為最小子狀態(出口),C構造成功后返回并完成子狀態B的構造,B構造成功后返回并完成狀態A的構造。
遞歸經典例子(計算階乘):
factorial(int n) {int m;if (n <= 1)m = 1;else m = n * factorial(n - 1);return m; }回溯:回溯(backtrack)則是一種算法思想。
我們取第一種解釋:上溯,向上推導。一個問題推導出多種可能,則選中其中一種可能繼續推導。如果一條路到達盡頭,則回到起點,選擇另外的路徑繼續推導,直到所有可能被推導完畢。
(另外的路徑:含有與之前推導過的路徑 不同的可能 的路徑)
知道深度優先搜索的同學,回溯就好像每結束深搜中的一條路線,都會返回一個這條路線上的元素所組成的序列,當所有序列被 一 一 列出,回溯結束。
算法上回溯常被用遞歸來實現,我把它理解成“子狀態不唯一的遞歸”(或者是“多分支的遞歸”)
回溯有剪枝的功能:每次剪掉 (輸出) 符合條件的樹枝,當回溯結束時(若問題有序:當遇到不符合條件的樹枝時停下,一種搜索過程的優化)我們就獲得了所有符合條件的樹枝 (答案)。
( 剪掉的部分是末端頂點到離它最近的一個有分叉的點)
回溯經典例子(8皇后問題,略)
最后
參考了CSDN博主 @繁拾簡憶 的博客《回溯和遞歸區別》
博文原鏈@繁拾簡憶《回溯和遞歸區別》
前言描述的題是力扣的 17.電話號碼的字母組合,官方題解用的是哈希表和回溯,后續會更新關于我學習哈希表的內容,整理學到的知識,加油奧利干!
(有不恰當的地方,望各路大佬可以指出來)
總結
以上是生活随笔為你收集整理的回溯和递归的区别(简述)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (力扣)中心扩散法求最长回文子串
- 下一篇: 几分钟学会归并排序和快速排序