非递归方法:
//非递归方法求解格雷码
public class Fgray {
public String[] getGray(int n) {
//创建一个长度为2的n次方的字符串数组用来保存结果
int num=(int)Math.pow(2, n);
String[] strs=new String[num];
strs[0]="0";
strs[1]="1";
if(n==1)
return strs;
//从n=1开始,通过翻转加0加1等求n=2的格雷码...直至求出最终的字符串数组
for(int i=2;i<=n;i++) {
int half=(int)Math.pow(2, i-1); //数组长度的一半
int length=(int)Math.pow(2,i); //数组长度
for(int j=0;j<half;j++) {
strs[length-j-1]="1"+strs[j];
strs[j]="0"+strs[j];
}
}
return strs;
}
}
递归方法:
public class Dgray { //递归算法实现
public String[] getGray(int n){
//设置一个字符串数组 大小为2的n次方
String[] strs=new String[(int)Math.pow(2,n)];
//如果n是1,则格雷码字串为0 1
if(n==1) {
strs[0]="0";
strs[1]="1";
return strs;
}
//递归思路 要求n位格雷码 则先求n-1位的格雷码
String[] str=getGray(n-1);
//n-1位的格雷码字符串前加0 翻转数组后在后半部分字符串前加1
for(int i=0;i<str.length;i++) {
strs[i]="0"+str[i];
strs[strs.length-1-i]="1"+str[i];
}
return strs;
}
}
测试类:
public class E {
public static void main(String[] args){
int n=4;
Dgray a=new Dgray(); //也可以用Fgray a=new Fgray();
int l=(int)Math.pow(2, n);
String[] res=new String[(l)];
res=a.getGray(n);
for(int m=0;m<l;m++) {
System.out.print(res[m]+" ");
}
}
}
运行结果: