procedure power_set (s) result := set () if *s = 0 then insert (result, set ()) # empty set else { head := set(?s) # take a random element # and find powerset of remaining part of set tail_pset := power_set (x -- head) result ++:= tail_pset # add powerset of remainder to results every ps := !tail_pset do # and add head to each powerset from the remainder insert (result, ps ++ head) } return result end