再帰関数による全探索
列挙対象の個数が少なくても再帰呼び出しの回数が多いと間に合わない場合がある。
常に$ 2通り以上に分岐し、必ず葉が列挙対象になるようにすることで、再帰呼び出しの回数を列挙対象の個数の高々$ 2倍に抑えられる。
例えば$ i番目の要素を選ぶ・選ばないで分岐する再帰の場合、
残りをすべて選ぶ・すべて選ばないことが確定するタイミングで再帰関数もreturnする。
(残りをすべて選ぶような取り方は直ちに値を返せないかもしれないが、累積和配列などで前計算しておくなどする) こうすると再帰呼び出しの木が全二分木になり、葉の個数が列挙対象の個数になる。
$ \mathrm{呼び出し回数} \leq 2 \cdot \mathrm{列挙対象の個数}となって再帰呼び出しの回数が抑えられる。