遞迴演算法是為了描述問題的某一狀態,必須用到該狀態的上一狀態,而描述上一狀態,又必須用到上一狀態的上一狀態……這種用自已來定義自己的方法,稱為遞迴定義。比如最出名的乙個問題,求斐波那契數列的第i位,如果用遞迴演算法做,就需要不斷遞迴得到前兩位的值。
而回溯演算法的本質是為了得到可能存在的所有情況,當乙個分支走到底之後,就返回頂點繼續遍歷下乙個分支。在這個返回頂點的過程,就需要不斷呼叫自身函式,這裡的呼叫自身函式是為了窮舉所有可能的情況。
之前對遞迴的理解有點狹隘,認為只要是函式呼叫自身就算遞迴。所以對於回溯演算法來說,回溯的過程函式也會呼叫自身,就容易將回溯與遞迴混淆。當然,對於有的特殊的問題,這兩者可能沒有明確的界限。
我們來具體地看一到題,用遞迴和回溯兩種方法解答,來看看遞迴和回溯的區別:
子集遞迴:首先我們來看遞迴的做法。假設要求陣列[1,2,3]的子集,我們需要先求得[1,2]的子集a1,然後向[1,2]子集的每個元素裡新增3這個元素,得到的新子集a2,再加上原來的子集a1,即為[1,2,3]的子集。給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
示例:輸入: nums = [1,2,3]
輸出:[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
]
所以我們開始假設輸出子集為空,每一步都向子集新增新的整數,並生成新的子集。
c++實現如下:
class solution };
for(int i=0;i回溯:
以示例為例,畫出樹狀圖。每次新增乙個元素,每次只新增上一節點右邊的元素。每乙個節點即為乙個子集。
c++實現如下:
class solution };//存放所有子集
vectortmp;//存放乙個子集
dfs(nums,v,tmp,0);
return v;}};
回溯法 回溯法介紹 回溯與遞迴的區別
回溯法 有一類問題,我們不知道它明確的計算法則。而是先進行試探,試探到最終狀況,發現不滿足問題的要求,則回溯到上乙個狀態繼續試探。這種不斷試探和回溯的思想,稱為回溯法 backtrcking 此類問題包括 求最優解 一組解 全部解。例如八皇后問題 回溯的演算法思想 一直往下走,然後再一步步往回走 面...
回溯和遞迴的區別
最近看資料結構,發現用到了很多遞迴和回溯的問題,實在是不知道這兩具體有啥區別,最近查了點資料,大概總結一下。遞迴 為了描述問題的某一狀態,必須用到該狀態的上一狀態,而描述上一狀態,又必須用到上一狀態的上一狀態 這種用自已來定義自己的方法,稱為遞迴定義。形式如 f n n f n 1 if n 0,f...
遞迴與回溯的理解
遞迴是什麼?求解問題 f 6 由於 f 6 n f 5 所以 f 6 需要拆解成 f 5 子問題進行求解,同理 f 5 n f 4 也需要進一步拆分,直到 f 1 這是 遞 f 1 解決了,由於 f 2 2 f 1 2 也解決了,f n 到最後也解決了,這是 歸 所以遞迴的本質是能把問題拆分成具有相...