Skip to content

Instantly share code, notes, and snippets.

@matthiasdebernardini
Created October 16, 2022 22:25
Show Gist options
  • Save matthiasdebernardini/bd15b8c28526439e6842d339aa74154e to your computer and use it in GitHub Desktop.
Save matthiasdebernardini/bd15b8c28526439e6842d339aa74154e to your computer and use it in GitHub Desktop.
get all possible combinations of size m in rust
fn comb<T>(slice: &[T], k: usize) -> Vec<Vec<T>>
where
T: Copy,
{
// If k == 1, return a vector containing a vector for each element of the slice.
if k == 1 {
return slice.iter().map(|x| vec![*x]).collect::<Vec<Vec<T>>>();
}
// If k is exactly the slice length, return the slice inside a vector.
if k == slice.len() {
return vec![slice.to_vec()];
}
// Make a vector from the first element + all combinations of k - 1 elements of the rest of the slice.
let mut result = comb(&slice[1..], k - 1)
.into_iter()
.map(|x| [&slice[..1], x.as_slice()].concat())
.collect::<Vec<Vec<T>>>();
// Extend this last vector with the all the combinations of k elements after from index 1 onward.
result.extend(comb(&slice[1..], k));
// Return final vector.
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment