從階乘遞迴到subset題解的遞迴思想擴充套件

2021-07-11 02:57:47 字數 2347 閱讀 3909

給定乙個含不同整數的集合,返回其所有的子集.如果 s = [1,2,3],有如下的解:

[ [3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],

]

求不同元素集合的全部子集問題,雖然網上有各種參考**,但是從**反過來去思考作者的思路很難。所以我一直認為**應該是寫給人看的,不應該過於追求**簡潔。

對於求子集問題,網路上ac的答案很多,解題方法有大致三種(推酷鏈結)。對於其中的遞迴解法**,我是看了很久不得要領,於是棄之,轉身自己琢磨。

首先,我們求 n 的階乘,很簡單。

int myfun(int n)

//將未知遞迴結果作為已知變數使用

int lastresult = myfun(n-1);

return n * lashresult ;

}

遞迴有幾個要素:

1. 退出條件

2. 引數變化

3. 遞推公式

對應的,在階乘中分別是

1. n是1或0

2. n每次減小1

3. (n的階乘) = n* (n-1的階乘)

然後,我們再去思考求子集問題。

[1,2,3]的子集:[ , [1], [2], [1,2], [3], [1,3], [2,3], [1,2,3] ]

[1,2] 的子集:[ , [1], [2], [1,2] ]

[1] 的子集:[ , [1] ]

求123的子集的過程就是:[1,2]的子集裡每個元素末尾加3,再並上原來的[1,2]。

抽象下就是:對前乙個元素的結果進行處理即得到當前元素的結果。

類似於:

求10的階乘的過程就是:9的階乘乘以10

抽象下就是:對9的結果進行處理即為10的結果。

為了求[1,2,3]的子集,我們需要求[1,2]的子集,為了求[1,2]的子集,又需要求[1]的子集,這樣不斷的遞迴深入將集合縮小,直到集合只剩下乙個元素,此時 [1] 的子集就只有[ , [1] ] (空集和1本身),同時這時也達到退出條件,遞迴帶著[1]的子集返回,依次返回計算出[1,2]的子集,[1,2,3]的子集。

求子集遞迴的要素:

1. 退出條件:當源集合元素個數為1

2. 引數變化:求子集的源集合依次縮小1個元素

3. 遞推公式:[1,2,3]的子集是[1,2]每個子集新增3,然後並上原[1,2]子集

於是,**會類似求 n 的階乘:

//source: vector[1,2,3]

//ind : source的下標

//call : subsethelper(source, source.size()-1)

vector

> subsethelper(vector

& source, int ind)

//引數變化:ind-1縮小需要求子集的集合直至只剩乙個元素

result = subsethelper(source, ind - 1);

//遞推公式:下面是將上次遞迴結果運用到遞推公式

vector

> ori = result;

//遞推公式步驟1:對[1,2]的每個子集新增3

int i = 0;

for ( i = 0; i < result.size(); i++)

//遞推公式步驟2:將[1,2]的子集和加3後的子集合並

result.insert(result.end(), ori.begin(), ori.end());

return result;

}

#include

#include

#include

using

namespace

std;

void subsethelper(vector

& source, int ind, vector

>& result)

subsethelper(source, ind - 1, result);

vector

> ori = result;//複製集合

//2int i = 0;

for ( i = 0; i < result.size(); i++)

//3result.insert(result.end(), ori.begin(), ori.end());

}int main()

意猶未盡?更多解法/舉一反三

從遞迴到動規(學習筆記)

區別 動態規劃是由已知推未知,由子問題推大問題,由邊界值逆推,相當於遞迴的逆過程。解題思想 1.分解子問題 將原問題分為若干子問題,子問題形式與原問題相似,規模減小,子問題的解求出來即儲存,不影響其他子問題,避免重複求解。2.確定狀態 狀態就是與解相關的一組變數,例如數字三角形求到底邊最大值時,每個...

演算法!動態規劃!從遞迴到動態規劃!

動態規劃演算法一直都是計算機程式設計的核心演算法之一,是必須具備的幾種核心演算法之一。博主是在b站中學習來的,並加入了自己的理解,從而加強記憶。auther wei yunshi luoxian date 2020 01 16 19 54 public class dynamicplan otp e...

從遞迴到DP 01揹包問題初探

目錄 問題描述 1.純遞迴解決,容易溢位 2.記憶化搜尋法 3.由記憶化搜尋推導遞推關係,使用動態規劃法dp 備註 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。測試樣例 n 4,w 5 42 3 ...