首先格雷码是一种编码方式,每两个相邻的码之间只有一个值不同(二进制位)。比如说:三位的格雷码是:
000,001,011,010,110,111,101,100
注意,第一个000,与100也是只有一个不一样的。
格雷码是可以这样产生的:
当只有一位的时候,格雷码要么是0,要么是1.
如果有两位的时候,格雷码是首先由 0
1
然后镜像对称得到后两位: 1
0
然后再在上面两行前面加上0,下面两行加1得到:
00
01
11
10
这就是二位的格雷码产生的过程。所以可以使用递归的方法去产生格雷码:
{ 0,1 n==1
f(n) = { f(n-1) n >=2
{ 对称翻转,然后上一半加0,后一半加1
代码:
template<typename T,unsigned int N> void recursive::grayCodeGeneration(T (*list)[N],std::size_t size)const{
if(size==1){//最后需要翻转输出
list[0][size-1]=0;
list[1][size-1]=1;
}
else{
grayCodeGeneration(list,size-1);
//下面做的是对称翻转
for(int i= std::pow(2,size-1),j=std::pow(2,size)-1;i < std::pow(2,size);++i)
for(int k = 0;k<N;k++)
list[i][k] = list[j-i][k];//对应的逆序的行进行保存,这个时候用到的是
//需要逆序保存的两个行之和是pow(2,size)-1;
//这一步做的是前一部分加0,后一步分加1
for(int i = 0;i < std::pow(2,size);i++){
if(i <= (std::pow(2,size)/2-1))
list[i][size-1]=0;
else
list[i][size-1]=1;
}
}
}