递归生成格雷码
2017-03-11 13:32
267 查看
来自鹅厂的一道编程题,主要是想对比一下递归的复杂度问题,题目描述如下:
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(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; } };
才发现自己智障了。。。
相关文章推荐
- C++递归生成格雷码
- 面试题60:递归生成格雷码
- 递归生成n位的格雷码
- 递归方法生成N位的格雷码
- 递归生成格雷码
- 2015腾讯笔试题-基于递归的格雷码生成
- 递归——生成格雷码(gray code)
- 生成N位格雷码的递归和递推写法
- 递归生成格雷码----腾讯2016研发工程师编程题
- 格雷码的递归生成
- 递归生成格雷码 gray code generation using recursion(c++)
- 减治法在生成子集问题中的应用(JAVA)--递归、二进制反射格雷码
- jquery+递归自动生成无限级菜单
- CI框架实现递归生成文件路径并重新生成图片功能
- 用递归方法产生格雷码;
- 基于递归分割的迷宫生成算法与自动寻路
- 格雷码的生成
- 递归枚举,子集生成,排列生成,回溯都是解决解答树的方法
- php递归生成实例代码
- 代码自动生成-宏递归思想