C++递归生成格雷码
来源:互联网 发布:apache 外网无法访问 编辑:程序博客网 时间:2024/06/04 01:33
一、格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。
例如以下为3位元的格雷码:
000
001
011
010
110
111
101
100
如果要产生n位元的格雷码,那么格雷码的个数为2^n.
除了最高位(左边第一位),格雷码的位元完全上下对称(看上面列表),因此可以采用递归的方式实现格雷码生成。
二、方法思想
第一步:产生 0, 1 两个字符串。
第二步:在第一步的基础上,每一个字符串都加上0和1,但是每次只能加一个,所以得做两次。这样就变成了 00,01,11,10 (注意对称)。
第三步:在第二步的基础上,再给每个字符串都加上0和1,同样,每次只能加一个,这样就变成了 000,001,011,010,110,111,101,100。
好了,这样就把3位元格雷码生成好了。
三、C++代码:
#include<iostream>using namespace std;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;}int main(){ int x; cin>>x; int m = 1; for(int i=0; i<x; i++) m*=2; char** p = GrayCode(x); for(int i=0; i<m; i++) { for(int j=0; j<x; j++) { cout<<p[i][j]; } cout<<endl; } return 0;}
0 0
- 递归生成格雷码 gray code generation using recursion(c++)
- C++递归生成格雷码
- 递归生成格雷码
- 递归生成格雷码
- 格雷码的递归生成
- [C#]读取数据库,动态生成TreeView[递归]
- 面试题60:递归生成格雷码
- 递归方法生成N位的格雷码
- 递归——生成格雷码(gray code)
- 递归生成n位的格雷码
- 格雷码递归实现(c++)
- C 递归
- 【c++】递归
- C 递归
- TreeView递归生成树
- 递归动态生成树
- 递归生成Menu
- 递归函数生成排列
- 2 Dimension list (list中的list)game 2048 part2
- Jailkit 限制Linux用户访问权限
- Python入门教程(适用有其他编程语言经验和计算机基础的人)
- POJ-2553 The Bottom of a Graph
- HDOJ 3951 Coin Game
- C++递归生成格雷码
- TCP四种定时器
- systemout-in
- 1162 数字【字符串】
- 碎片Fragment
- hdu 1853 Cyclic Tour /3488 Going Home 费用流判环
- 第二章 Apache Hadoop2 linux下的编译
- 网络编程之socket、epoll
- CodeForces 10A - Power Consumption Calculation