Permutations: Difference between revisions
Content added Content deleted
m (→{{header|C sharp|C#}}: Eliminated method call not included in source here) |
|||
Line 4,511: | Line 4,511: | ||
=={{header|Rust}}== |
=={{header|Rust}}== |
||
===Iterative=== |
===Iterative=== |
||
Uses Heap's algorithm. An in-place version is possible but is incompatible with <code>Iterator</code>. |
|||
<lang rust> |
<lang rust>pub fn permutations(size: usize) -> Permutations { |
||
⚫ | |||
⚫ | |||
elems: Vec<T>, |
|||
idx: usize, |
|||
} |
} |
||
pub struct Permutations { |
|||
impl<T: Clone> QuickPerm<T> { |
|||
idxs: Vec<usize>, |
|||
⚫ | |||
⚫ | |||
i: usize, |
|||
} |
} |
||
impl |
impl Iterator for Permutations { |
||
type Item = Vec< |
type Item = Vec<usize>; |
||
fn next(&mut self) -> Option<Self::Item> { |
fn next(&mut self) -> Option<Self::Item> { |
||
if self. |
if self.i > 0 { |
||
loop { |
|||
self. |
if self.i >= self.swaps.len() { return None; } |
||
if self.swaps[self.i] < self.i { break; } |
|||
self. |
self.swaps[self.i] = 0; |
||
self. |
self.i += 1; |
||
} |
|||
self.idxs |
self.idxs.swap(self.i, (self.i & 1) * self.swaps[self.i]); |
||
self. |
self.swaps[self.i] += 1; |
||
} |
} |
||
self.i = 1; |
|||
Some(self.idxs.clone()) |
|||
} |
} |
||
} |
} |
||
fn main() { |
fn main() { |
||
let perms = permutations(3).collect::<Vec<_>>(); |
|||
for perm in QuickPerm::new(vec![1,2,3]) { |
|||
assert_eq!(perms, vec![ |
|||
vec![0, 1, 2], |
|||
⚫ | |||
vec![1, 0, 2], |
|||
vec![2, 0, 1], |
|||
vec![0, 2, 1], |
|||
vec![1, 2, 0], |
|||
vec![2, 1, 0], |
|||
⚫ | |||
}</lang> |
}</lang> |
||