#include<iostream>
#include<string>
#include<vector>
using namespace std;
/// 第一次遇到递归输出格雷码这道题的时候,就知道格雷码的编码上肯定是存在某种规律的,但是我找到的各种规律却
///很难用代码描述出来。后来在网上找了很多资料,发现格雷码原来有这样一种规律:
/// n位格雷码其实是在n-1位格雷码的基础上添加0、1得到的,添加规律为 n-1位格雷码正序前面添加0 逆序格雷码
/// 前面添加1 即可得到n位的格雷码
vector<string> GetGrayCode(int nBit)
{
vector<string>result;
if(nBit==0)
{
return result;
}
else if(nBit==1)
{
result.push_back("0");
result.push_back("1");
return result;
}
vector<string>temp=GetGrayCode(nBit-1);
for(int i=0;i<temp.size();i++)
{
result.push_back("0"+temp[i]);
}
for(int i=temp.size()-1;i>=0;i--)
{
result.push_back("1"+temp[i]);
}
return result;
}
int main()
{
int n=0;
scanf("%d",&n);
vector<string>result=GetGrayCode(n);
for(int i=0;i<result.size();i++)
{
cout<<result[i]<<endl;
}
return 0;
}
#include<string>
#include<vector>
using namespace std;
/// 第一次遇到递归输出格雷码这道题的时候,就知道格雷码的编码上肯定是存在某种规律的,但是我找到的各种规律却
///很难用代码描述出来。后来在网上找了很多资料,发现格雷码原来有这样一种规律:
/// n位格雷码其实是在n-1位格雷码的基础上添加0、1得到的,添加规律为 n-1位格雷码正序前面添加0 逆序格雷码
/// 前面添加1 即可得到n位的格雷码
/// 比如 1位格雷码为 0 1,则2位为 00 01 11 10 三位为 000 001 011 010 110 111 101 100
vector<string> GetGrayCode(int nBit)
{
vector<string>result;
if(nBit==0)
{
return result;
}
else if(nBit==1)
{
result.push_back("0");
result.push_back("1");
return result;
}
vector<string>temp=GetGrayCode(nBit-1);
for(int i=0;i<temp.size();i++)
{
result.push_back("0"+temp[i]);
}
for(int i=temp.size()-1;i>=0;i--)
{
result.push_back("1"+temp[i]);
}
return result;
}
int main()
{
int n=0;
scanf("%d",&n);
vector<string>result=GetGrayCode(n);
for(int i=0;i<result.size();i++)
{
cout<<result[i]<<endl;
}
return 0;
}