Power set: Difference between revisions
Content added Content deleted
m (→Recursive: subheading change) |
(→{{header|Icon}} and {{header|Unicon}}: added introduction) |
||
Line 766: | Line 766: | ||
=={{header|Icon}} and {{header|Unicon}}== |
=={{header|Icon}} and {{header|Unicon}}== |
||
The two examples below show the similarities and differences between constructing an explicit representation of the solution, i.e. a set containing the powerset, and one using generators. The basic recursive algorithm is the same in each case, but wherever the first stores part of the result away, the second uses 'suspend' to immediate pass the result back to the caller. The caller may then decide to store the results in a set, a list, or dispose of each one as it appears. |
|||
===Set building=== |
===Set building=== |
||
Line 777: | Line 779: | ||
then insert (result, set ()) # empty set |
then insert (result, set ()) # empty set |
||
else { |
else { |
||
head := ?s # take a random element |
head := set(?s) # take a random element |
||
# and find powerset of remaining part of set |
# and find powerset of remaining part of set |
||
tail_pset := power_set (x -- |
tail_pset := power_set (x -- head) |
||
result ++:= tail_pset # add powerset of remainder to results |
result ++:= tail_pset # add powerset of remainder to results |
||
every ps := !tail_pset do # and add head to each powerset from the remainder |
every ps := !tail_pset do # and add head to each powerset from the remainder |
||
insert (result, ps ++ |
insert (result, ps ++ head) |
||
} |
} |
||
return result |
return result |
||
Line 792: | Line 794: | ||
<lang Icon> |
<lang Icon> |
||
procedure main () |
procedure main () |
||
every s := !power_set (set(1,2,3,4)) do { |
every s := !power_set (set(1,2,3,4)) do { # requires '!' to generate items in the result set |
||
writes ("[ ") |
writes ("[ ") |
||
every writes (!s || " ") |
every writes (!s || " ") |
||
Line 829: | Line 831: | ||
then suspend set () |
then suspend set () |
||
else { |
else { |
||
head := ?s |
head := set(?s) |
||
every ps := power_set |
every ps := power_set (s -- head) do { |
||
suspend ps |
suspend ps |
||
suspend |
suspend ps ++ head |
||
} |
} |
||
} |
} |
||
Line 838: | Line 840: | ||
procedure main () |
procedure main () |
||
every s := power_set (set(1,2,3,4)) do { |
every s := power_set (set(1,2,3,4)) do { # power_set's values are generated by 'every' |
||
writes ("[ ") |
writes ("[ ") |
||
every writes (!s || " ") |
every writes (!s || " ") |