递归生成格雷码

腾讯2016研发笔试

/* 递归生成格雷码 当n=1时,{0,1} 当n=2时,{00,01,11,10} 当n=3时,{000,001,011,010,110,111,101,100} ... n位格雷码共有2^n个元素。 其中每个元素是(n-1)位的格雷码前面加0,然后再反向后前面加1生成的。 如n=3可由n=2进行两步操作后得到: 1.在n=2的格雷码前面加0,生成:000,001,011,010 2.在n=2的格雷码逆序后前面加1,生成:110,111,101,100 将两部分顺序输出即得n=3的格雷码。 */

#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;

vector<string> getGray(int n){
    vector<string> ret;
    if(n==1){
        ret.push_back("0");
        ret.push_back("1");
        return ret;
    }
    vector<string> v = getGray(n-1);
    int len = pow(2,n-1);
    for(int i = 0;i<len;++i){
        ret.push_back("0"+v[i]);
    }
    for(int i = len-1;i>=0;--i){
        ret.push_back("1"+v[i]);
    }
    return ret;

}

int main()
{
    vector<string> v;
    int n;
    cin >> n;
    v=getGray(n);

    for(int i=0;i<pow(2,n);++i)
        cout << v[i] << endl;

    return 0;
}

你可能感兴趣的:(递归,格雷码)