面试题60:递归生成格雷码

格雷码:任意相邻的代码只有一位二进制位不同。

每个二进制数为n位,每个二进制数相比,都只有一位二进制码不相同;

比如n=1,{0,1};

n=2,{00,01,11,10};

n=3,{000,001,011,010,110,111,101,100}

思路:

以n=3的情况为例

000

001

011

010

110

111

101

100

在实现的时候,我们可以在上一层加上0或1,用递归来实现。

第一步:产生0和1两个字符串

第二步:在两个字符串前面分别加上0和1,得到00,01,11,10(注意对称)

第三步:在第二步的基础上给每个字符串加上0和1

由上面分析可知:

n位格雷码是基于n-1位格雷码生成的。

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


vector<string> getGray(int n) {
	if (n == 1)
	{
		vector<string> re;
		re.push_back("0");
		re.push_back("1");
		return re;
	}
	vector<string> last = getGray(n - 1);
	int curSize = last.size() * 2;
	vector<string> current(curSize);
	for (int i = 0; i < last.size(); i++)
	{
		current[i] = "0" + last[i];
		current[curSize - 1 - i] = '1' + last[i];
	}
	return current;
}

int main()
{
	vector<string> re = getGray(4);
	for (int i = 0; i < re.size(); i++)
		cout << re[i] << endl;
	return 0;
}


你可能感兴趣的:(面试题60:递归生成格雷码)