C++再帰生成グレイコード

9471 ワード

まず、グレイ符号は、隣接する2つの符号の間に1つの値しか異なる符号化方式である(バイナリビット).例えば、3人のグレイコードは:
			000,001,011,010,110,111,101,100

注意、最初の000は、100とは1つだけ違います.グレイコードは、次のように生成されます.
0,   1.0
								    1
		           :			1
									0
		            01  :
									00
									01
									11
									10
		              。                 :
						{	0,1								n==1
				f(n)  = {   f(n-1)							n >=2
						{01
								   

コード:
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;
        }
    }
}