Gray码是一个长度为2^N的序列,序列中无相同元素,每个元素都是长度为N位的(0,1)串,相邻元素恰好只有一位不同,用分置策略设计一个算法对任意的N构造相应的Gray码。
下面先对N值较小的情况进行分析:
当N=1 时的GRAY码为:0 ,1
当N=2 时的GRAY码为:00,01,11,10
当N=3时的GRAY码为:000,001,011,010,110,111,101,100;
我们用G(n)表示n位GRAY码序列,从上面N=1,2,3的简单情形可以看出G(n)的构造规律:
N
位GRAY码前加一个0,N位GRAY码的逆序排列前加一个1,然后把添加了0和1的两列GRAY码并在一起就构成了N+1位的GRAY码序列。用公式表示为G(n+1)=0G(n)1g(n),其中g(n)表示G(n)的逆序排列,可用数学归纳法证明
G(n)的上述构造规律。
由此规律容易设计构造G(n)的分治法如下。
void gray(int n)
{
if(n==1){a[1]=0;a[2]=1;return;}
gray(n-1);
for(int k=1<0;i--)a[2*k-i+1]=a[i]+k;
cout<
}
上述算法中将n位(0,1)串看作是二进制整数,第i个串存储a[i]中。
完成计算后,由out输出GRAY码序列。
void out(int n)
{
char str[32];
int m=1<
for(int i=1;i<=m;i++)
{
itoa(a[i],str,2);//把a[i]转换成2进制的字符串在传给str;
int s=strlen(str);
for(int j=0;j<
cout<
}
cout<
参考材料:计算机算法设计与分析(第4版,王晓东)