C++递归生成格雷码

来源:互联网 发布:apache 外网无法访问 编辑:程序博客网 时间:2024/06/04 01:33
一、格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。
例如以下为3位元的格雷码:
000
001
011
010
110
111
101
100 
如果要产生n位元的格雷码,那么格雷码的个数为2^n.
除了最高位(左边第一位),格雷码的位元完全上下对称(看上面列表),因此可以采用递归的方式实现格雷码生成。
二、方法思想
第一步:产生 0, 1 两个字符串。
第二步:在第一步的基础上,每一个字符串都加上0和1,但是每次只能加一个,所以得做两次。这样就变成了 00,01,11,10 (注意对称)。
第三步:在第二步的基础上,再给每个字符串都加上0和1,同样,每次只能加一个,这样就变成了 000,001,011,010,110,111,101,100。
好了,这样就把3位元格雷码生成好了。
三、C++代码:
#include<iostream>using namespace std;char** GrayCode(int n){    int temp = 1;    for(int i=0; i<n; i++)        temp*=2;//n位格雷码一共有2^n个码字    char **graycode = new char*[temp];//动态申请2^n *n大小的数组,存放格雷码    for(int i=0; i<temp; i++)    {        graycode[i]=new char[n];//动态申请二维数组    }    if(n==1)    {//递归终止条件        graycode[0][0]='0';        graycode[1][0]='1';        return graycode;    }    char **p = GrayCode(n-1);//开始递归    for(int i=0; i<temp/2; i++)    {        graycode[i][0]='0';                graycode[i+temp/2][0]='1';        for(int j=1;j<n; j++)        {            graycode[i][j]=p[i][j-1];            graycode[temp-i-1][j]=p[i][j-1];//注意是顺序,上下对称        }    }    return graycode;}int main(){    int x;    cin>>x;    int m = 1;    for(int i=0; i<x; i++)        m*=2;    char** p = GrayCode(x);    for(int i=0; i<m; i++)    {        for(int j=0; j<x; j++)        {            cout<<p[i][j];        }        cout<<endl;    }    return 0;}



0 0
原创粉丝点击