pub fn gray_code(n: usize) -> Vec<u64> {
let size = 1 << n;
let mut result = Vec::with_capacity(size);
for i in 0..size {
let gray = (i ^ (i >> 1)) as u64;
result.push(gray);
}
result
}
#[cfg(test)]
mod tests {
use super::gray_code;
#[test]
fn test_gray_code_n2() {
let codes = gray_code(2);
assert_eq!(codes, vec![0, 1, 3, 2]);
}
#[test]
fn test_gray_code_n3() {
let codes = gray_code(3);
assert_eq!(codes, vec![0, 1, 3, 2, 6, 7, 5, 4]);
}
#[test]
fn test_gray_code_n0() {
let codes = gray_code(0);
assert_eq!(codes, vec![0]);
}
}