百度百科上有:
递归生成码表
这种方法基于格雷码是反射码的事实,利用递归的如下规则来构造:
-
1位格雷码有两个码字
-
(n+1)位格雷码中的前2 n个码字等于n位格雷码的码字,按顺序书写,加前缀0
-
n+1位格雷码的集合 = n位格雷码集合(顺序)加前缀0 + n位格雷码集合(逆序)加前缀1
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> code;
if (n == 0)
{
code.push_back(0);
}
else
{
vector<int> c;
int k;
k = 1 << (n-1);
c = grayCode(n-1);
code.reserve(2*k);
for (int i = 0; i < k; i++)
code.push_back(c[i]);
for (int i = k-1; i >= 0; i--)
code.push_back(c[i]|k);
}
return code;
}
};