Skip to content

Commit 700d07f

Browse files
mbrubeckbrson
authored andcommitted
---
yaml --- r: 6125 b: refs/heads/master c: 5970e9c h: refs/heads/master i: 6123: f0a879b v: v3
1 parent 373865b commit 700d07f

File tree

3 files changed

+47
-1
lines changed

3 files changed

+47
-1
lines changed

[refs]

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 558ca9b4a81b801d0957a734bd20f73ca00cede1
2+
refs/heads/master: 5970e9c117ebf0b3056536553dee046fa05b6c9d

trunk/src/lib/vec.rs

+25
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,31 @@ fn riter2<T>(v: [mutable? T], f: block(uint, T)) {
734734
};
735735
}
736736

737+
/*
738+
Function: permute
739+
740+
Iterate over all permutations of vector `v`. Permutations are produced in
741+
lexicographic order with respect to the order of elements in `v` (so if `v`
742+
is sorted then the permutations are lexicographically sorted).
743+
744+
The total number of permutations produced is `len(v)!`. If `v` contains
745+
repeated elements, then some permutations are repeated.
746+
*/
747+
fn permute<T>(v: [mutable? T], put: block([T])) {
748+
let ln = len(v);
749+
if ln == 0u {
750+
put([]);
751+
} else {
752+
let i = 0u;
753+
while i < ln {
754+
let elt = v[i];
755+
let rest = slice(v, 0u, i) + slice(v, i+1u, ln);
756+
permute(rest) {|permutation| put([elt] + permutation)}
757+
i += 1u;
758+
}
759+
}
760+
}
761+
737762
/*
738763
Function: to_ptr
739764

trunk/src/test/stdtest/vec.rs

+21
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,27 @@ fn riter2() {
366366
assert i == 3;
367367
}
368368

369+
#[test]
370+
fn test_permute() {
371+
let results: [[int]];
372+
373+
results = [];
374+
permute([]) {|v| results += [v]; }
375+
assert results == [[]];
376+
377+
results = [];
378+
permute([7]) {|v| results += [v]; }
379+
assert results == [[7]];
380+
381+
results = [];
382+
permute([1,1]) {|v| results += [v]; }
383+
assert results == [[1,1],[1,1]];
384+
385+
results = [];
386+
permute([5,2,0]) {|v| results += [v]; }
387+
assert results == [[5,2,0],[5,0,2],[2,5,0],[2,0,5],[0,5,2],[0,2,5]];
388+
}
389+
369390
#[test]
370391
fn test_any_and_all() {
371392
assert (vec::any(is_three, [1u, 2u, 3u]));

0 commit comments

Comments
 (0)