生成给定集合的子集(使用递归)的程序的执行涉及哪些步骤
What are the steps involved in the execution of the program which generates the subset of a given set (using recursion)?
为集合的子集编程
#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 }
对于这种问题,有时,更好的方法是拿着笔和纸,手动"执行"软件:
- 调用
search(0)
(subset = { }
)- 调用
search(1)
(subset = { }
)- 调用
search(2)
(subset = { }
)- 调用
search(3)
(subset = { }
)- 打印
subset
(subset = { }
)
- 打印
- 子集中的推回2(
subset = { 2 }
) - 呼叫
search(3)
(subset = { 2 }
)- 打印
subset
(subset = { 2 }
)
- 打印
- 删除最后一个元素(
subset = { }
)当您返回
search(1)
时,subset
仍处于与调用search(2)
之前相同的状态
- 调用
- 子集中的推回1(
subset = { 1 }
) - 呼叫
search(2)
(subset = { 1 }
)- 调用
search(3)
(subset = { 1 }
)- 打印
subset
(subset = { 1 }
)
- 打印
- 子集中的推回2(
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)
之前相同的状态
- 调用
- 子集中的推回0(
subset = { 0 }
) - 呼叫
search(1)
(subset = { 0 }
)- 呼叫
search(2)
(subset = { 0 }
)- 呼叫
search(3)
(subset = { 0 }
)- 打印
subset
(subset = { 0 }
)
- 打印
- 子集中的推回2(
subset = { 0, 2 }
) - 呼叫
search(3)
(subset = { 0, 2 }
)- 打印
subset
(subset = { 0, 2 }
)
- 打印
- 删除最后一个元素(
subset = { 0 }
)当您返回
search(1)
时,subset
仍处于与调用search(2)
之前相同的状态
- 呼叫
- 子集中的推回1(
subset = { 0, 1 }
) - 呼叫
search(2)
(subset = { 0, 1 }
)- 呼叫
search(3)
(subset = { 0, 1 }
)- 打印
subset
(subset = { 0, 1 }
)
- 打印
- 子集中的推回2(
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
,则会有所不同。
相关文章:
- 程序在执行程序的其余部分之前退出
- libprotobuf 检查在 Mac OS 上执行程序时失败
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 在另一台 PC 上执行程序时加载 SDL2 共享库时出错
- 从 GUI 文件资源管理器执行程序,并且不生成终端
- 测试操作系统时执行程序集"sti"时虚拟框崩溃
- 重新执行C++程序会加快速度
- 如何用共享库替换可执行C++程序的功能?
- 编译并执行C#程序中的C++代码
- 如果我在 Linux 上更改C++动态共享库,而我的可执行程序在其上使用,会发生什么
- 在C++中,系统如何将这些对象中的每一个与执行程序的窗口相关联?
- 命令行参数执行C 程序
- 按 e 执行程序C++
- 在返回另一个函数的函数中执行程序期间出错
- 如何使用"trusty"映像在本地执行C++程序的Travis CI?
- 当我们说在执行程序时将操作系统的控制权传递给main()函数时,我们的意思是什么
- execve(..) 不执行程序,尽管传入了 PATH 变量
- 在机器异常之后重新执行程序
- 调试和发布库及其可执行程序
- 当访问者进入网站时执行C++程序