zoukankan      html  css  js  c++  java
  • 构造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;
        }
    }
    View Code

  • 相关阅读:
    多表关联查询_resultMap_集合对象
    mybatis多表关联查询之resultMap单个对象
    十二.filter
    十二.函数式编程
    十一.列表生成式
    十,迭代
    九.高级特性
    八.函数
    七.条件判断和循环
    六.使用list和tuple
  • 原文地址:https://www.cnblogs.com/yuanzhenliu/p/5322537.html
Copyright © 2011-2022 走看看