import java.util.Arrays;
public class 格雷码二进制 {
//求n位数的格雷码
//递归思路为求n-1的格雷码,n-2的格雷码
//返回值为n位数的格雷码的数组
public String[] getGray(int n) {
//每一位都有2种可能,所以总的格雷码的数量为2的n次方,也是结果数组的长度
//用result来当结果集
String[] result=new String[(int)Math.pow(2,n)];
//递归终止条件是只有一位数的格雷码,它的数组的位数是2的1次方
//是两位数,第一个是0,第二个是1;
if(n==1){
result[0]="0";
result[1]="1";
return result;
}
//递归求n-1位的格雷码
String[] last=getGray(n-1);
System.out.println(Arrays.toString(last));
//n位数的格雷码等于0和1分别和n-1格雷码拼接而成的
//每个格雷码都可以看成一步步拼接而来的
for(int i=0;i<last.length;i++){
//0和n-1为格雷码拼接起来,写在他们的前面
result[i]="0"+last[i];
//1和n-1的格雷码拼接起来,写在他们的前面
result[result.length-i-1]="1"+last[i];
//相当于一次给result这个结果集里加入两个元素 0开头1个和 1开头一个
}
return result;
}
}