C++ 递归产生格雷码

首先格雷码是一种编码方式,每两个相邻的码之间只有一个值不同(二进制位)。比如说:三位的格雷码是:

			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;
        }
    }
}

你可能感兴趣的:(C++)