递归生成格雷码

Posted OneDay-X

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归生成格雷码相关的知识,希望对你有一定的参考价值。

来自鹅厂的一道编程题,主要是想对比一下递归的复杂度问题,题目描述如下:

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。
给定一个整数n,请返回n位的格雷码,顺序为从0开始。
测试样例:
1
返回:[“0”,”1”]

递归的思路比较简单(列举n = 1, n = 2, n = 3也可以比较容易发现规律):就是n位gray码是由n-1位gray码生成,例如:
求n=3的gray码,首先知道n=2的gray码是(00,01,11,10),那么n=3的gray码其实就是对n=2的gray码首位添加0或1生成的,添加0后变成(000,001,011,010),添加1后需要顺序反向就变成(110,111,101,100)。组合在一起就是(000,001,011,010,110,111,101,100)

我最开始的实现:

class GrayCode 
public:
    vector<string> getGray(int n) 
        vector<string> result;
        if (n == 1) 
            result.push_back("0");
            result.push_back("1");
            return result;
         else 
            for (int i = 0; i < pow(2, n-1); i++) 
                result.push_back("0"+getGray(n-1)[i]);
            
            for (int j = pow(2, n-1)-1; j >= 0; j--) 
                result.push_back("1"+getGray(n-1)[j]);
            
            return result;
        
    
;

参考代码:

class GrayCode 
public:
    vector<string> getGray(int n) 
        // write code here
        vector<string> gray;
        if(n == 1)
            gray.push_back("0");
            gray.push_back("1");
            return gray;
        
        vector<string> last_gray = getGray(n-1);
        for(int i = 0; i < last_gray.size(); i++)
            gray.push_back("0"+last_gray[i]);
        for(int i = last_gray.size()-1; i >= 0; i--)
            gray.push_back("1"+last_gray[i]);

        return gray;
    
;

才发现自己智障了。。。

以上是关于递归生成格雷码的主要内容,如果未能解决你的问题,请参考以下文章

[腾讯]生成格雷码

腾讯生成格雷码

格雷码生成

构造N位格雷码(递归,面向对象)

格雷码那点事——递归非递归实现

gray code 格雷码 递归