为集合的子集编程
#include <bits/stdc++.h>
using namespace std;
vector<int> subset;
int n = 3;
void search(int k) {
if (k == n) {
cout << "{ ";
for (auto x : subset) {
cout << x;
if ( x != subset.back() )
cout << ", ";
}
cout << " } ";
}
else {
search(k+1); //**Explanation**
subset.push_back(k); // **for**
search(k+1); //**these**
subset.pop_back(); //**statements**
}
}
int main() {
int k = 0;
search(k);
}
我无法理解 else 部分中提供的代码。
O / P: -
{ } { 2 } { 1 } { 1, 2 } { 0 } { 0, 2 } { 0, 1 } { 0, 1, 2 }
答案 0 :(得分:1)
有了这样的问题,有时候,更好的办法就是用笔和一张纸来手工“执行”软件:
search(0)
(subset = { }
)
search(1)
(subset = { }
)
search(2)
(subset = { }
)
search(3)
(subset = { }
)
subset
(subset = { }
)subset = { 2 }
)search(3)
(subset = { 2 }
)
subset
(subset = { 2 }
)subset = { }
)
当您返回
之前相同的状态search(1)
时,subset
仍然处于与search(2)
subset = { 1 }
)search(2)
(subset = { 1 }
)
search(3)
(subset = { 1 }
)
subset
(subset = { 1 }
)subset = { 1, 2 }
)search(3)
(subset = { 1, 2 }
)
subset
(subset = { 1, 2 }
)subset = { 1 }
)
当您返回
之前相同的状态search(1)
时,subset
仍然处于与search(2)
subset = { }
)
当您返回
之前相同的状态search(0)
时,subset
仍然处于与search(1)
subset = { 0 }
)search(1)
(subset = { 0 }
)
search(2)
(subset = { 0 }
)
search(3)
(subset = { 0 }
)
subset
(subset = { 0 }
)subset = { 0, 2 }
)search(3)
(subset = { 0, 2 }
)
subset
(subset = { 0, 2 }
)subset = { 0 }
)
当您返回
之前相同的状态search(1)
时,subset
仍然处于与search(2)
subset = { 0, 1 }
)search(2)
(subset = { 0, 1 }
)
search(3)
(subset = { 0, 1 }
)
subset
(subset = { 0, 1 }
)subset = { 0, 1, 2 }
)search(3)
(subset = { 0, 1, 2 }
)
subset
(subset = { 0, 1, 2 }
)subset = { 0, 1 }
)
当您返回
之前相同的状态search(1)
时,subset
仍然处于与search(2)
subset = { 0 }
)
当您返回
之前相同的状态search(0)
时,subset
仍然处于与search(1)
subset = { }
)
当您返回
之前相同的状态main
时,subset
仍然处于与search(0)
有了这个,我们可以看到push_back
用于填充subset
,pop_back
用于清理/撤消操作佣人。实际上,您使用的是全局变量,也可以通过此函数的先前调用使用。在此算法中,您必须清除它以恢复调用者的此变量的状态。如果按值传递subset
,则会有所不同。