欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

java 递归生成格雷码_格雷码的递归生成

发布时间:2025/3/19 编程问答 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 java 递归生成格雷码_格雷码的递归生成 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

问题:产生n位元的全部格雷码。html

格雷码(Gray Code)是一个数列集合,每一个数使用二进位来表示,假设使用n位元来表示每一个数字,任两个数之间只有一个位元值不一样。

例如如下为3位元的格雷码: 000 001 011 010 110 111 101 100 。

若是要产生n位元的格雷码,那么格雷码的个数为2^n.java

假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右边的位元值;第二步,改变右起第一个为1的位元的左边位元;第三步,第四步重复第一步和第二步,直到全部的格雷码产生完毕(换句话说,已经走了(2^n) - 1 步)。web

用一个例子来讲明:

假设产生3位元的格雷码,原始值位 000

第一步:改变最右边的位元值: 001

第二步:改变右起第一个为1的位元的左边位元: 011

第三步:改变最右边的位元值: 010

第四步:改变右起第一个为1的位元的左边位元: 110

第五步:改变最右边的位元值: 111

第六步:改变右起第一个为1的位元的左边位元: 101

第七步:改变最右边的位元值: 100面试

若是按照这个规则来生成格雷码,是没有问题的,可是这样作太复杂了。若是仔细观察格雷码的结构,咱们会有如下发现:

一、除了最高位(左边第一位),格雷码的位元彻底上下对称(看下面列表)。好比第一个格雷码与最后一个格雷码对称(除了第一位),第二个格雷码与倒数第二个对称,以此类推。

二、最小的重复单元是 0 , 1。svg

000

001

011

010

110

111

101

100google

因此,在实现的时候,咱们彻底能够利用递归,在每一层前面加上0或者1,而后就能够列出全部的格雷码。

好比:

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

第二步:在第一步的基础上,每个字符串都加上0和1,可是每次只能加一个,因此得作两次。这样就变成了 00,01,11,10 (注意对称)。

第三步:在第二步的基础上,再给每一个字符串都加上0和1,一样,每次只能加一个,这样就变成了 000,001,011,010,110,111,101,100。

好了,这样就把3位元格雷码生成好了。

若是要生成4位元格雷码,咱们只须要在3位元格雷码上再加一层0,1就能够了: 0000,0001,0011,0010,0110,0111,0101,0100,1100,1101,1110,1010,0111,1001,1000.spa

也就是说,n位元格雷码是基于n-1位元格雷码产生的。.net

若是可以理解上面的部分,下面部分的代码实现就很容易理解了。

[java] view plain copy

public String[] GrayCode(int n) { code

// produce 2^n grade codes

String[] graycode = new String[(int) Math.pow(2, n)];

if (n == 1) {

graycode[0] = "0";

graycode[1] = "1";

return graycode;

}

String[] last = GrayCode(n - 1);

for (int i = 0; i < last.length; i++) {

graycode[i] = "0" + last[i];

graycode[graycode.length - 1 - i] = "1" + last[i];

}

return graycode;

} xml

格雷码还有一种实现方式是根据这个公式来的 G(n) = B(n) XOR B(n+1), 这也是格雷码和二进制码的转换公式。代码以下:

[java] view plain copy

public void getGrayCode(int bitNum){

for(int i = 0; i < (int)Math.pow(2, bitNum); i++){

int grayCode = (i >> 1) ^ i;

System.out.println(num2Binary(grayCode, bitNum));

}

}

public String num2Binary(int num, int bitNum){

String ret = "";

for(int i = bitNum-1; i >= 0; i--){

ret += (num >> i) & 1;

}

return ret;

}

这是一道google 的面试题,以上代码均是网友peking2 和 SEwind520写成。原题还要求把二进制码转成十进制数。

参考:http://www.mitbbs.com/article_t/JobHunting/32003667.html

转载请注明出处:blog.csdn.net/beiyeqingteng

总结

以上是生活随笔为你收集整理的java 递归生成格雷码_格雷码的递归生成的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。