题目描述:
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码,请编写一种函数,使用递归的方式生成n为的格雷码。 给定一个整数n,返回n位的格雷码,顺序从0开始。
根据题意,我们先来看一下出入不同的数,输出的结果是多少?
输入1:0 1
输入2:00 01 11 10
输入3:000 001 011 010 110 111 101 100
。。。
这个时候,我们就可以看出规律:
- 除了1之外,其他所有位数的格雷码的个数都是2的n次方。
- 每位的格雷码可以分成两部分看,前一半就是上一个位数的格雷码前面加上“0”,后一半就是上一位数的格雷码的逆序,前面加上“1”。
好了,看到这里就可以开始写代码了:
import java.util.Scanner;
class GrayCode {
public String[] getGray(int n) {
String[] str = new String[2<<(n-1)];
createGrayCode(str,n);
return str;
}
private static void createGrayCode(String[] codes, int n){
if (n == 1){
codes[0] = "0";
codes[1] = "1";
}else {
createGrayCode(codes,n-1);
int len = 2<<(n-1);
int mid = len>>1;
for (int i = len-1,j = 0; i >= 0; i--){
if (i < mid){
codes[i] = "0"+codes[--j];
}else {
codes[i] = "1"+codes[j++];
}
}
}
}
}
public class Test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
GrayCode grayCode = new GrayCode();
String[] str = grayCode.getGray(n);
for (String t : str)
System.out.print(t+" ");
}
}
运行结果: