欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-12 12:58:40
...
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));
	}

}