问题描述
递归和非递归生成N位格雷码
问题解析
什么是格雷码?
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)。由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。
参考代码
递归
http://blog.csdn.net/beiyeqingteng/article/details/7044471
基于格雷码是反射码
1位格雷码有两个码字;n+1位格雷码的集合 = n位格雷码集合(顺序)加前缀0 + n位格雷码集合(逆序)加前缀1
package xianggen.others;
import java.util.Scanner;
/**
*
* GrayCode.java
* @author xianggen
* @date 2016年8月1日 上午10:02:03
*/
public class GrayCode {
public static void main(String[] args) {
int n;
String[] result;
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
n=scan.nextInt();
result=grayCode(n);
display(result);
}
}
/**
* 搞懂递归
* @param n
* @return
*/
public static String[] grayCode(int n){
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;
}
public static void display(String[] astr){
for(int i=0;i<astr.length;i++)
System.out.println(astr[i]);
}
}
异或转换
根据对应的n位二进制码直接得到n位格雷码码字
- 对n位二进制的码字,从右到左,以0到n-1编号
- 如果二进制码字的第i位和i+1位相同,则对应的格雷码的第i位为0,否则为1(当i+1=n时,二进制码字的第n位被认为是0,即第n-1位不变);
公式:G(n) = B(n) XOR B(n+1)
/**
* 非递归
* @param n
*/
public static void getGrayCode(int n){
for(int i = 0; i < (int)Math.pow(2, n); i++){
int grayCode = (i >> 1) ^ i;
System.out.println(num2Binary(grayCode, n));
}
}
public static String num2Binary(int num, int n){
String ret = "";
for(int i = n-1; i >= 0; i--){
ret += (num >> i) & 1;
System.out.println(": "+ret);
}
return ret;
}