格雷码 (Gray code)

格雷码是任意两个相邻数的代码只有一位二进制数不同的编码

例如 3 位格雷码为

000
001
011
010
110
111
101
100

生成格雷码的代码为

#include <iostream>
#include <vector>


// 产生 n 位格雷格雷码
//
// 采用方法为镜射构建法
// n 位格雷码可由 n - 1 位格雷码得到
//
// 只需在 n - 1 位格雷码的前面加上 "0", 整体再加上
// 将 n - 1 位格雷码逆序之后在前面加上 "1"
//
// 例如:
// 0    00    000
// 1    01    001
//      11    011
//      10    010
//            110
//            111
//            101
//            100
std::vector<std::string> StringGrayCode(int n)
{
    if (n == 1) {
        return std::vector<std::string> {"0", "1"};
    }

    std::vector<std::string> gray_code_old = StringGrayCode(n - 1);
    std::vector<std::string> gray_code_new{};
    for (auto per_gray_code : gray_code_old) {
        gray_code_new.push_back("0" + per_gray_code);
    }
    for (auto p_per_gray_code = gray_code_old.rbegin();
            p_per_gray_code != gray_code_old.rend(); ++p_per_gray_code) {
        gray_code_new.push_back("1" + *p_per_gray_code);
    }

    return gray_code_new;
}

int main(int argc, char *argv[])
{
    for (auto per_gray_code : StringGrayCode(4)) {
        std::cout << per_gray_code << std::endl;
    }

    return 0;
}