Для каждого k мы просто вызываем search(k+1)
рекурсивно.один раз со значением k внутри вашего набора и один раз без него.
search(k+1); // call search (k+1) with k NOT inside the set
subset.push_back(k); // puts the value k inside the set
search(k+1); // call search (k+1) with k inside the set
subset.pop_back(); // removes the value k from the set
Как только мы достигнем n == k , рекурсия прекращается.
Представьте себе двоичное дерево глубины n, где каждый уровень представляет текущее значение, а две ветви - решение, входит ли значение в ваш окончательный набор или нет.Листья представляют все заключительные наборы.
Итак, учитывая n = 3 и начиная с k = 0 , вы получите:
search(0);
-> search(1); // with 0 in
->-> search(2); // with 0 in AND 1 in
->->-> search (3); // with 0 in AND 1 in AND 2 in. terminates with (0,1,2)
->->-> search (3); // with 0 in AND 1 in AND 2 not in. terminates with (0,1)
->-> search(2); // with 0 in AND 1 not in
->->-> search (3); // with 0 in AND 1 not in AND 2 in. terminates with (0,2)
->->-> search (3); // with 0 in AND 1 not in AND 2 not in. terminates with (0)
-> search(1); // with 0 not in
->-> search(2); // with 0 not in AND 1 in
->->-> search (3); // with 0 not in AND 1 in AND 2 in. terminates with (1,2)
->->-> search (3); // with 0 not in AND 1 in AND 2 not in. terminates with (1)
->-> search(2); // with 0 not in AND 1 not in
->->-> search (3); // with 0 not in AND 1 not in AND 2 in. terminates with (2)
->->-> search (3); // with 0 not in AND 1 not in AND 2 not in. terminates with ()
As Джон , умно указав в своем комментарии, рекурсия использует тот факт, что:
all_subsets (a1, a2, ..., an) == all_subsets (a2, ..., an) U {a1, all_subsets (a2, ..., an)} , где U - оператор объединения множеств.
Многие другие математические определения преобразуются в рекурсивные вызовыестественно.