生成给定集合的子集(使用递归)的程序的执行涉及哪些步骤

What are the steps involved in the execution of the program which generates the subset of a given set (using recursion)?

本文关键字:执行 程序 集合 子集 递归      更新时间:2023-10-16

为集合的子集编程

#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用于填充subsetpop_back用于通过该步骤清理/撤消动作女仆。实际上,您使用了一个全局变量,该变量也由该函数的前一次调用使用。在这个算法中,您必须对其进行清理,以便为调用者恢复该变量的状态。如果按值传递subset,则会有所不同。