Существует тривиальное биективное отображение из набора степеней X = {A, B, C, D, E, F, G, H, I} в набор чисел между 0 и 2 ^ | X | = 2 ^ 9:
Ø отображается на 000000000 (база 2)
{A} соответствует 100000000 (база 2)
{B} соответствует 010000000 (база 2)
{C} соответствует 001000000 (база 2)
...
{I} соответствует 000000001 (база 2)
{A, B} соответствует 110000000 (база 2)
{A, C} соответствует 101000000 (база 2)
...
{A, B, C, D, E, F, G, H, I} соответствует 111111111 (база 2)
Вы можете использовать это наблюдение для создания набора мощности, подобного этому (псевдокод):
Set powerset = new Set();
for(int i between 0 and 2^9)
{
Set subset = new Set();
for each enabled bit in i add the corresponding letter to subset
add subset to powerset
}
Таким образом, вы избегаете любой рекурсии (и, в зависимости от того, для чего вам нужен блок питания, вы можете даже иметь возможность «генерировать» блок питания без выделения большого количества структур данных - например, если вам просто нужно распечатать набор мощности).