格雷编码的递归实现
所谓的格雷编码问题简单的说指的是 : 生成一个从0到2^N-1的数组, 使得相邻两个数的二进制位有且只相差一位
譬如说 N=2 二进制编码 00 01 11 10 对应整数0 ,1, 3, 2
我们可以采用如下方式生成 :
N=1 0 1
N=2 00 01 || 11 10 /*前半部分就是规模为N-1问题的求解结果 \ 后半部分元素是 对前半部分依次逆序并加2^1*/
N=3 000001 011010 || 110111 101 100 /*前半部分就是规模为N-1问题的求解结果 \ 后半部分元素是 对前半部分依次逆序并加2^2*/
N=4 .....
对于规模为N的格雷编码问题可以在 规模为N-1问题的基础上(作为前半部分) 并将其按照逆序 依次加上2^(N-1)(为了保证最高位是1)就可以得到对规模为N的问题的求解
代码如下:
#include "stdafx.h"
#include<vector>#include<iostream>
using namespace std;
void gray_code(vector<int> &result, int N)
{
if (N <= 0)
{
return;
}
if (N == 1) //出口条件
{
result.push_back(0);
result.push_back(1);
}
else
{
gray_code(result, N - 1);
int len = result.size()-1;
for (; len >= 0; len--)
{
result.push_back((1 << (N - 1)) + result[len]);
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> res;
gray_code(res, 4);
return 0;
}