↑Programmieren in Rust
fn cartesian_product<T: Clone>(a: &[Vec<T>]) -> Vec<Vec<T>> { if a.is_empty() { vec![Vec::new()] } else { let mut acc: Vec<Vec<T>> = Vec::new(); for x in &a[0] { for t in cartesian_product(&a[1..]) { acc.push([x.clone()].iter().cloned().chain(t).collect()); } } acc } } fn main() { let p = cartesian_product(&[vec![0, 1], vec![0, 1]]); println!("{:?}", p); }
fn pow_rec(a: &mut [u32], m: u32, i: usize, callback: &mut dyn FnMut(&[u32]) ) { if i == a.len() { callback(a); } else { for k in 0..m { a[i] = k; pow_rec(a, m, i + 1, callback); } } } fn cartesian_power(m: u32, n: u32) -> Vec<Vec<u32>> { let mut acc: Vec<Vec<u32>> = vec![]; let a = &mut vec![0; n as usize]; pow_rec(a, m, 0, &mut |a| { acc.push(Vec::from(a)); }); acc }
// Nach Umwandlung der Rekursion in eine Iteration fn pow(a: &mut [u32], m: u32, callback: &mut dyn FnMut(&[u32]) ) { let n = a.len(); let mut stack: Vec<u32> = Vec::with_capacity(n); let mut k = 0; let mut i = 0; loop { if i == n { callback(a); } else { if k<m { a[i] = k; stack.push(k); k = 0; i += 1; continue; } } match stack.pop() { Some(value) => {i -= 1; k = value + 1;} _ => break } } } fn cartesian_power(m: u32, n: u32) -> Vec<Vec<u32>> { let mut acc: Vec<Vec<u32>> = vec![]; let a = &mut vec![0; n as usize]; pow(a, m, &mut |a| { acc.push(Vec::from(a)); }); acc }
fn power_set<T: Clone>(a: impl IntoIterator<Item=T>) -> Vec<Vec<T>> { let mut ps = vec![vec![]]; for x in a { for mut s in ps.clone() { s.push(x.clone()); ps.push(s); } } ps }
fn power_set<T: Clone>(a: impl IntoIterator<Item = T>) -> Vec<Vec<T>> { a.into_iter().fold(vec![vec![]], |mut ps, x| { let push_x = |mut s| {s.push(x.clone()); s}; ps.extend(ps.clone().into_iter().map(push_x)); ps }) }
// Algorithmus von Heap fn perm<T>(a: &mut [T], n: usize, callback: &mut dyn FnMut(&[T]) ) { if n == 1 { callback(a); } else { perm(a, n - 1, callback); for i in 0..n-1 { if n%2 == 0 { a.swap(i, n - 1); } else { a.swap(0, n - 1); } perm(a, n - 1, callback); } } } fn permutations<T: Clone>(a: &[T]) -> Vec<Vec<T>> { let mut acc: Vec<Vec<T>> = vec![]; let n = a.len(); let a = &mut Vec::from(a); perm(a, n, &mut |a| {acc.push(Vec::from(a));}); acc } fn main() { println!("{:?}", permutations(&[1, 2, 3])); }
// Algorithmus von Heap in der iterativen Formulierung fn perm<T>(a: &mut [T], callback: &mut dyn FnMut(&[T])) { let n = a.len(); let mut stack = vec![0; n]; callback(a); let mut i = 0; while i<n { if stack[i]<i { if i%2 == 0 { a.swap(0, i); } else { a.swap(stack[i], i); } callback(a); stack[i] += 1; i = 0; } else { stack[i] = 0; i += 1; } } } fn permutations<T: Clone>(a: &[T]) -> Vec<Vec<T>> { let mut acc: Vec<Vec<T>> = vec![]; let a = &mut Vec::from(a); perm(a, &mut |a| {acc.push(Vec::from(a));}); acc } fn main() { for t in permutations(&[1, 2, 3]) { println!("{:?}", t); } }
fn choose(n: u64, mut k: u64) -> u64 { if k > n {return 0;} if k > n - k {k = n - k;} let mut acc = 1; for i in 0..k { acc = acc*(n - i)/(i + 1); } acc } fn tabluate(label: &str, a0: u64, a1: u64, b0: u64, b1: u64, shift: usize, f: &dyn Fn(u64,u64)->u64) { print!("{:^5}|", label); for b in b0..=b1 {print!("{:>1$}", b, shift);} println!("\n{:\u{2500}<1$}", "", 6 + shift*((b1 - b0 + 1) as usize)); for a in a0..=a1 { print!("{:>4} |", a); for b in b0..=b1 {print!("{:>1$}", f(a, b), shift);} println!(); } } fn main() { tabluate("n\\k", 0, 10, 0, 10, 4, &choose); }