格雷码的几种实现方式 递归 迭代 递推

来源:互联网 发布:excel数据等距分组 编辑:程序博客网 时间:2024/06/11 21:47
递归方式
class GrayCode {public:    vector<string> getGray(int n) {        // write code here        vector<string> res;        if(n == 1) {            res.push_back("0");            res.push_back("1");            return res;        }        vector<string> v = getGray(n - 1);        for(int i = 0; i < v.size(); i++) {            res.push_back("0" + v[i]);        }        for(int i = v.size() - 1; i >= 0; i--) {            res.push_back("1" + v[i]);        }        return res;    }};

迭代方式

void Gray(int n){    if(n<=0)        return;    vector<string> result;    int len=pow(2,n);    result.reserve(len);    result.push_back("0");    result.push_back("1");    for(int i=1;i<n;i++)    {        for(int j=result.size();j>0;)        {              result.push_back(result[--j]);        }        for(int j=0;j<result.size()/2;j++)            result[j]="0"+result[j];        for(int j=result.size()/2;j<result.size();j++)            result[j]="1"+result[j];    }    for(int i=0;i<len;i++)        cout<<result[i]<<endl;}

递推方式

 

void gray_code(int n){int *a=new int[1<<n];for(int i=0;i<1<<n;i++){a[i]=i<<1^i;}}
<pre class="html" name="code">void _10_2(int n,int nb=0)//十进制转为二进制字符串{int m = log(n*1.0) / log(2.0);if (nb != 0){string rreess(nb, '0');for (int i = 0; i <= m; i++){int r = (n&(1 << (m - i))) >> (m - i);rreess[nb - m - 1 + i] = r + '0';}cout << rreess;}else{char res[1000] = { 0 };for (int i = 0; i <= m; i++){int r = (n&(1 << (m - i))) >> (m - i);res[i] = r + '0';}cout << res;}} 

0 0