Power set: Difference between revisions
Content added Content deleted
Line 3,410: | Line 3,410: | ||
#<Set: {#<Set: {}>, #<Set: {1}>, #<Set: {2}>, #<Set: {1, 2}>, #<Set: {3}>, #<Set: {1, 3}>, #<Set: {2, 3}>, #<Set: {1, 2, 3}>}> |
#<Set: {#<Set: {}>, #<Set: {1}>, #<Set: {2}>, #<Set: {1, 2}>, #<Set: {3}>, #<Set: {1, 3}>, #<Set: {2, 3}>, #<Set: {1, 2, 3}>}> |
||
</pre> |
</pre> |
||
=={{header|Rust}}== |
|||
This implementation consumes the input set, requires that the type <b>T</b> has a full order a.k.a implements the <b>Ord</b> trait and that <b>T</b> is clonable. |
|||
<lang rust>use std::collections::BTreeSet; |
|||
fn powerset<T: Ord + Clone>(mut set: BTreeSet<T>) -> BTreeSet<BTreeSet<T>> { |
|||
if set.is_empty() { |
|||
let mut powerset = BTreeSet::new(); |
|||
powerset.insert(set); |
|||
return powerset; |
|||
} |
|||
// Access the first value. This could be replaced with `set.pop_first().unwrap()` |
|||
// But this is an unstable feature |
|||
let entry = set.iter().nth(0).unwrap().clone(); |
|||
set.remove(&entry); |
|||
let mut powerset = powerset(set); |
|||
for mut set in powerset.clone().into_iter() { |
|||
set.insert(entry.clone()); |
|||
powerset.insert(set); |
|||
} |
|||
powerset |
|||
} |
|||
fn main() { |
|||
let set = (0..5).collect(); |
|||
let set = powerset(set); |
|||
println!("{:?}", set); |
|||
} |
|||
</lang> |
|||
{{out}} |
|||
<pre>{{}, {0}, {0, 1}, {0, 1, 2}, {0, 1, 2, 3}, {0, 1, 2, 3, 4}, {0, 1, 2, 4}, {0, 1, 3}, {0, 1, 3, 4}, {0, 1, 4}, {0, 2}, {0, 2, 3}, {0, 2, 3, 4}, {0, 2, 4}, {0, 3}, {0, 3, 4}, {0, 4}, {1}, {1, 2}, {1, 2, 3}, {1, 2, 3, 4}, {1, 2, 4}, {1, 3}, {1, 3, 4}, {1, 4}, {2}, {2, 3}, {2, 3, 4}, {2, 4}, {3}, {3, 4}, {4}} |
|||
</pre> |
|||
=={{header|SAS}}== |
=={{header|SAS}}== |