构造N位格雷码(递归,面向对象)

问题:
递归打印出N位格雷码(相邻两个编码只有一位数字不同):
      问题化归为:现有前N位的格雷码,如何构造N+1位的格雷码?

解决方法:采用递归构造格雷码集和。

  递归出口:n = 1; 此时格雷码{0,1}
  N+1:N+1位的格雷码 = N位格雷码(顺序)+0,N位格雷码逆序+1(N位的格雷码顺序最后一个编码与逆序第一个编码是同一个编码,在此可以分别加0,1两个编码依旧只有一位不同)

public class GC{
    int[][] G;//
    int N;
    int SIZE;
    GC(int N){
        this.N = N;
        SIZE =(int)Math.pow(2,N);
        G = createG(G,N);
    }
    public int[][] createG(int[][] g,int N){//由原有的格雷码集合g造新的格雷码集G  递归构造
        if(N <1){
            return null;
        }
        if(N == 1){
            g = new int[2][1];
            g[0][0] = 0;
            g[1][0] = 1;
            return g;
        }
        g = createG(g,N-1);
        SIZE =(int)Math.pow(2,N);
        G = new int[SIZE][N];
        int n =N-1;//原格雷码的位数
        for(int i =0;i<SIZE/2;i++){//顺序
            for(int j=0;j<n;j++){
                G[i][j] = g[i][j];
            }
            G[i][N-1] = 0;
        }
        for(int i = SIZE/2;i<SIZE;i++){//逆序
            for(int j=0;j<n;j++){
                G[i][j] = g[SIZE-1-i][j];
            }
            G[i][N-1] = 1;
        }
        return G;
    }
    public void show(){
        for(int i =0;i<SIZE;i++){
            for(int j=0;j<N;j++){
                System.out.print(G[i][j]+" ");
            }
            System.out.println();
        }
    }
    public static void main(String[] args){
        int N = new Integer(args[0]).intValue();
        GC G= new GC(N);
        G.show();
        return;
    }
}

时间: 2024-10-09 07:05:16

构造N位格雷码(递归,面向对象)的相关文章

gray code 格雷码 递归

格雷码 the n-1 bit code, with 0 prepended to each word, followd by the n-1 bit code in reverse order, with 1 prepended to each word. public class GrayCode{ public static void gray(int n, String prefix) { if(n == 0) System.out.println(prefix); else { gra

C程序设计的抽象思维-递归过程-格雷码

[问题] 每一对相邻整数的二进制表示只有一位发生变化,这种编码称为Gray码. 如下所示3位的Gray码: 000 0 001 1 011 2 010 3 110 4 111 5 101 6 100 7 要产生N位的Gray码,所需的递归思想概括如下: 1. 写出N-1位的Gray码. 2. 以相反的顺序在该Gray码下重写一遍. 3. 在第一步得到的Gray码前加0,在第二步得到的Gray码前加1. 继续以3位Gray码为例,推导过程如下所示: [代码] #include <stdio.h>

格雷码那点事——递归非递归实现

简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码.在数字系统中,常要求代码按一定顺序变化.例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100.1111等).在特定情况下可能导致电路状态错误或输入错误.使用格雷码可以避免这种错误.格雷码有多种

格雷码实现

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码.在数字系统中,常要求代码按一定顺序变化.例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100.1111等).在特定情况下可能导致电路状态错误或输入错误.使用格雷码可以避免这种错误.格雷码有多种编码形

【LeetCode-面试算法经典-Java实现】【089-Gray Code(格雷码)】

[089-Gray Code(格雷码)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 The gray code is a binary numeral system where two successive values differ in only one bit. Given a non-negative integer n representing the total number of bits in the code, print the sequen

算法学习(6)----整数转换为格雷码

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码.在数字系统中,常要求代码按一定顺序变化.例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100.1111等).在特定情况下可能导致电路状态错误或输入错误.使用格雷码可以避免这种错误.格雷码有多种编码形

LeetCode 格雷码序列的生成

问题概述:在一组数的编码中,若随意两个相邻的代码仅仅有一位二进制数不同.则称这样的编码为格雷码. 2位数的格雷码序列:00 : 001 : 111 : 310 : 2找规律:假设要求n位的格雷码,先要求出n-1位的格雷码. 循环上一次格雷码的每一位,都会生成两个新的格雷码: 统计'1'出现的次数假设为偶数: 两个新格雷码分别为xxx1和xxx0假设为奇数: 两个新格雷码分别为xxx0和xxx1 以3位格雷码为例: 由00得:000 = 00+(0)001 = 00+(1) 由01得:011 =

格雷码与二进制码的转换

Gray Code是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,是一种绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环.单步特性消除了随机取数时出现重大误差的可能,它的反射.自补特性使得求反非常方便.格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲.而格雷码则没有这一缺

格雷码与二进制码互相转换

参考百科:http://baike.baidu.com/link?url=mr53i-76Ue3cGMnqWwG_lam8Zfwbfhdk8JnHEHhEU0nfzpIZ8l583KdcTIahIQIoSTYtL02DpWnt4goCByUQ9a 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码. 二进制码→格雷码(编码): 此方法从对应的n位二进制码字中直接得