递归方法生成N位的格雷码

来源:互联网 发布:电饭煲型号推荐 知乎 编辑:程序博客网 时间:2024/06/05 14:16

原理:

点击打开链接

网上看见的几种形式的函数:

动态字符数组形式:

char** GrayCode(int n)

{
int temp = 1;
for (int i = 0; i<n; i++)
temp *= 2;//n位格雷码一共有2^n个码字  
char **graycode = new char*[temp];//动态申请2^n *n大小的数组,存放格雷码  
for (int i = 0; i<temp; i++)
{
graycode[i] = new char[n];//动态申请二维数组  
}
if (n == 1)
{//递归终止条件  
graycode[0][0] = '0';
graycode[1][0] = '1';
return graycode;
}
char **p = GrayCode(n - 1);//开始递归  
for (int i = 0; i<temp / 2; i++)
{
graycode[i][0] = '0';
graycode[i + temp / 2][0] = '1';
for (int j = 1; j<n; j++)
{
graycode[i][j] = p[i][j - 1];
graycode[temp - i - 1][j] = p[i][j - 1];//注意是顺序,上下对称  
}
}
return graycode;
}


string指针:

string* recursive_Graycode(int N)
{
int len = pow(2, N);
string* s = new string [len];
if (N == 1)
{
s[0] = "0";
s[1] = "1";
return s;
}
string* last = recursive_Graycode(N - 1);
for (int i = 0; i < pow(2,N-1); i++)
{
s[i] = "0" + last[i];
s[len - 1 - i] = "1" + last[i];
}
delete[] last; //删除上一个
return s;

}

感觉最简单的是用dfs形式的:

#include<iostream>
using namespace std;

int N;//
char* s;
char** out;
int cnt = 0;

void dfs(int i);

int main()
{
cin >> N;

s = new char[N+1];
for (int i = 0; i<N; i++) 
s[i] = '0';
s[N] = '\0';    //尾部加上‘\0’,这样后面使用strcpy_s得到的outmo末尾就有结束符了。


out = new char*[pow(2, N)];
for (int i = 0; i < pow(2, N); ++i)
out[i] = new char[N];

dfs(0);

for (int i = 0; i < pow(2, N); ++i)
cout << out[i]<<endl;

return 0;
}

void dfs(int i)
{

if (i == N)
strcpy_s(out[cnt++],N+1, s);//到达底部就输出
//out[cnt++] = s; //不能直接赋
else
{
dfs(i + 1); //深度优先搜索
if (s[i] == '0') s[i] = '1';
else s[i] = '0'; //把当前位逆转
dfs(i + 1); //继续向下搜索
}
}

参见:http://outofmemory.cn/code-snippet/534/C-language-produce-gelei-code-gray-code-DFS-release

0 0
原创粉丝点击