This SRFI implements several useful procedures of combinations, permutations and related operations.
Sets in the following procedures are in
the sense of SRFI 1, that is, lists.
Some of these procedures have two variants: a procedure without
star (e.g. permutations
) treats all elements in the given
set distinct, while a procedure with star (e.g. permutations*
)
considers duplication. The procedures with star take a pred
argument that is used to test equality.
permutations
setpermutations*
pred setReturns a list of all permutations of a list set.
(permutations '(a b c)) ⇒ ((a b c) (a c b) (b a c) (b c a) (c a b) (c b a)) (permutations '(a a b)) ⇒ ((a a b) (a b a) (a a b) (a b a) (b a a) (b a a)) (permutations* '(a a b)) ⇒ ((a a b) (a b a) (b a a))
The number of possible permutations explodes if set has
more than several elements. Use with care. If you want to process
each permutation at a time, consider permutations-for-each
below.
permutations-for-each
proc setpermutations*-for-each
proc pred setFor each permutation of a list set, calls proc. Returns an undefined value.
combinations
set ncombinations*
pred set nReturns a list of all possible combinations of n elements out of a list set.
(combinations '(a b c) 2) ⇒ ((a b) (a c) (b c)) (combinations '(a a b) 2) ⇒ ((a a) (a b) (a b)) (combinations* '(a a b) 2) ⇒ ((a a) (a b))
Watch out for the explosion of combinations when set is large.
combinations-for-each
proc set ncombinations*-for-each
proc pred set nCalls proc for each combination of n elements out of set. Returns an undefined value.
power-set
setpower-set*
pred setReturns power set (all subsets) of a list set.
(power-set '(a b c)) ⇒ (() (a) (b) (c) (a b) (a c) (b c) (a b c)) (power-set* '(a a b) ⇒ (() (a) (b) (a a) (a b) (a a b))
power-set-binary
setReturns power set of set, like power-set
, but in different order.
Power-set-binary
traverses subset space in depth-first order,
while power-set
in breadth-first order.
(power-set-binary '(a b c)) ⇒ (() (c) (b) (b c) (a) (a c) (a b) (a b c))
cartesian-product
list-of-setscartesian-product-right
list-of-setsReturns a cartesian product of sets in list-of-sets.
Cartesian-product
construct the result in left fixed order
(the rightmost element varies first), while
cartesian-product-right
in right fixed order
(the leftmost element varies first).
(cartesian-product '((a b c) (0 1))) ⇒ ((a 0) (a 1) (b 0) (b 1) (c 0) (c 1)) (cartesian-product-right '((a b c) (0 1))) ⇒ ((a 0) (b 0) (c 0) (a 1) (b 1) (c 1))
group-list
list [ key [ test ]
]Groups consecutive elements in a list list which
have the common key value. A key value of an element is
obtained by applying the procedure key to the element;
the default procedure is identity
.
For each element in list, key is applied exactly once.
The equal-ness of keys are compared by test procedure,
whose default is eqv?
.
(group-list '(1 1 1 2 3 4 4 2 2 3 1 1 3)) ⇒ ((1 1 1) (2) (3) (4 4) (2 2) (3) (1 1) (3)) (group-list '(1 1 1 2 3 4 4 2 2 3 1 1 3) :key (cut modulo <> 2))) ⇒ ((1 1 1) (2) (3) (4 4 2 2) (3 1 1 3)) (group-list '#("a" "a" "b" "b" "c" "d" "d") :test string=?) ⇒ (("a" "a") ("b" "b") ("c") ("d" "d")) (group-list "aabbcdd" :test char=?) ⇒ ((#\a #\a) (#\b #\b) (#\c) (#\d #\d))
permute
vector permuter [ fallback ]Returns a newly created vector, in which the elements are permuted from src according to permuter.
Permuter is a list of exact integers. When the k-th element
of permuter is i, the k-th element of the result
is (ref src i)
. Therefore, the size of the result
list is the same as the size of permuter. Permuter
can be any kind of list, unrelated to the type of src.
The same index i can appear more than once in permuter.
(permute '#(a b c d) '(3 2 0 1)) ⇒ #(d c a b) (permute '#(a b c d) '(0 2)) ⇒ #(a c) (permute '#(a b c d) '(0 0 1 1 2 2)) ⇒ #(a a b b c c)
If an integer in permuter is out of the valid range for an index of vector, then fallback is returned.
(permute '#(a b c) '(3 2 1 0) 'foo) ⇒ #(foo c b a) (permute "!,HWdelor" #(2 5 6 6 7 1 -1 3 7 8 6 4 0) #\space) ⇒ "Hello, World!"
default-random-source
from
SRFI 27.
make-permutation-generator
vectorReturns a generator that yields random permutations of vector.
(generator->list (make-permutation-generator '(1 2 3)) 3) ⇒ ((1 2 3) (2 3 1) (3 2 1)) (generator->list (make-permutation-generator "abc") 3) ⇒ ("cba" "cba" "cab") |
make-combination-generator
size vectorReturns a generator that yields vectors of size elements randomly picked from vector.
(generator->list (make-combination-generatorh 2 #(a b c)) 5) ⇒ (#(a c) #(a b) #(a c) #(b a) #(a c)) (generator->list (make-combination-generator 2 '#(a b c)) 5) ⇒ (#(a c) #(b c) #(c b) #(b a) #(b c)) |