递归与分治1

格雷码问题:

对于给定的正整数n,格雷码为满足如下条件的一个编码序列:

(1) 序列由2n个编码组成,每个编码都是长度为n的二进制位串。

(2) 序列中无相同的编码。

(3) 序列中位置相邻的两个编码恰有一位不同。

例如:n=1时的格雷码为:{0, 1}

n=2时的格雷码为:{00, 01, 11, 10}

n=3时的格雷码为:{000, 001, 011, 010,110,111,101,100}

gray码问题求解思想:

将一个规模ngray码序列表示为G(n), G(n)以相反顺序排列的序列表示为G(n)。则gray码的构造规则即子问题的划分规则为:G(n+1)= 0G(n) 1G(n)

gray码问题代码:G(n+1)= G(n) 0G(n)1

import java.util.*;
import java.io.*;
public class Gray{
  public static String[] GrayCode(int n){
     String[] grayCodeArr=new String[(int)Math.pow(2,n)];
      
     if(n<1){
        System.out.println("");
     }
     if(n==1){
        grayCodeArr[0]="0";
        grayCodeArr[1]="1";
        return grayCodeArr;
     }
      //n-1格雷码
     String[] before=GrayCode(n-1);
     for(int i=0;i<before.length; i++){
        grayCodeArr[i]="0"+before[i];
        grayCodeArr[grayCodeArr.length-1-i]="1"+before[i];
     }
     return grayCodeArr;
  }

  public static void main(String[] arg){
     Scanner input=new Scanner(System.in);
     int n=input.nextInt();
     String[] strArr=GrayCode(n);
     for(int i=0;i<strArr.length;i++){
        System.out.println(strArr[i]);
     }
  }
}
原文地址:https://www.cnblogs.com/ljs-666/p/7892193.html