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

时间:2017-10-19 12:50:22

标签: c++ 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 }

1 个答案:

答案 0 :(得分:1)

有了这样的问题,有时候,更好的办法就是用笔和一张纸来手工“执行”软件:

  • 致电search(0)subset = { }
    • 致电search(1)subset = { }
      • 致电search(2)subset = { }
        • 致电search(3)subset = { }
          • 打印subsetsubset = { }
        • 在子集(subset = { 2 }
        • 中推回2
        • 致电search(3)subset = { 2 }
          • 打印subsetsubset = { 2 }
        • 删除最后一个元素(subset = { }
            

          当您返回search(1)时,subset仍然处于与search(2)

          之前相同的状态
      • 在子集(subset = { 1 }
      • 中推回1
      • 致电search(2)subset = { 1 }
        • 致电search(3)subset = { 1 }
          • 打印subsetsubset = { 1 }
        • 在子集(subset = { 1, 2 }
        • 中推回2
        • 致电search(3)subset = { 1, 2 }
          • 打印subsetsubset = { 1, 2 }
        • 删除最后一个元素(subset = { 1 }
            

          当您返回search(1)时,subset仍然处于与search(2)

          之前相同的状态
      • 删除最后一个元素(subset = { }
          

        当您返回search(0)时,subset仍然处于与search(1)

        之前相同的状态
    • 在子集(subset = { 0 }
    • 中推回0
    • 致电search(1)subset = { 0 }
      • 致电search(2)subset = { 0 }
        • 致电search(3)subset = { 0 }
          • 打印subsetsubset = { 0 }
        • 在子集(subset = { 0, 2 }
        • 中推回2
        • 致电search(3)subset = { 0, 2 }
          • 打印subsetsubset = { 0, 2 }
        • 删除最后一个元素(subset = { 0 }
            

          当您返回search(1)时,subset仍然处于与search(2)

          之前相同的状态
      • 在子集(subset = { 0, 1 }
      • 中推回1
      • 致电search(2)subset = { 0, 1 }
        • 致电search(3)subset = { 0, 1 }
          • 打印subsetsubset = { 0, 1 }
        • 在子集(subset = { 0, 1, 2 }
        • 中推回2
        • 致电search(3)subset = { 0, 1, 2 }
          • 打印subsetsubset = { 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,则会有所不同。