2016 腾讯笔试编程题_格雷编码

格雷编码的递归实现

   所谓的格雷编码问题简单的说指的是  : 生成一个从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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值