用递归实现生成Gray码的算法

来源:互联网 发布:线缆测试仪福禄克网络 编辑:程序博客网 时间:2024/06/07 12:43
Gray码是一种数字编码方式,是一个长度为
如:
当n= 1时
0
1
当n= 2时
00
01

11
10
当n= 3时
000
001
011
010

110
111
101
100
从以上可以看出,gray的规律
m = pow(2, n);
gray(n) = 0gray(n-1) (k < m/2)

          1rgray(n-1) (k >= m/2, rgray()是gray序列的逆序)

java代码实现:

public class Gray {public static char[][] gray(int n) {int m = (int)Math.pow(2, n);char g[][] = new char[m][n];char g1[][];if(n <1) {System.err.println("the number of n should larger than zero!");return null;} else if(1 == n){g[0][0] = '0';g[1][0] = '1';} else if(n > 1){ g1 = gray(n-1);for(int i=0; i<m; i++) {if(i < m/2) {g[i][0] = '0';} else {g[i][0] = '1';}for(int j=1; j<n; j++) {if(i < m/2) {g[i][j] = g1[i][j-1];} else {g[i][j] = g1[m-1-i][j-1];//m/2-1-(i-m/2)=m-1-i}}}}return g;}public static void printGray(char[][] g) {int m = g.length;int n = g[0].length;if(n <1) {System.err.println("the number of n should larger than zero!");return;} for(int i=0; i<m; i++){for(int j=0; j<n; j++) {System.out.print(g[i][j]);}System.out.println();}}/** * @param args */public static void main(String[] args) {printGray(gray(3));}}


原创粉丝点击