1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
pub fn generate_gray_code(n_bits: u8) -> Vec<u8> {
    assert!(n_bits > 0);

    if n_bits == 1 {
        vec![0u8, 1]
    } else {
        let last_code = generate_gray_code(n_bits - 1);

        let mut last_code_reversed = last_code.clone();
        last_code_reversed.reverse();

        for i in last_code_reversed.iter_mut() {
            *i |= 1 << (n_bits - 1);
        }

        [last_code, last_code_reversed].concat()
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_gray_codes() {
        let code = generate_gray_code(1);
        println!("{code:?}");

        let code = generate_gray_code(2);
        println!("{code:?}");

        let code = generate_gray_code(3);
        println!("{code:?}");
    }
}