概述
生成格雷码
题目
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)请编写一个函数,使用递归的方法生成N位的格雷码。
给定一个整数n,请返回n位的格雷码,顺序为从0开始。
测试样例:
1
返回:[“0”,“1”]
什么是格雷码
格雷码任意两个相邻的代码只有一位二进制数不同,例如下图
格雷码属于可靠性编码,是一种错误最小化的编码方式。因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。
递归生成码表
这种方法基于格雷码是反射码的事实,利用递归的如下规则来构造:
- 1位格雷码有两个码字
- (n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0
- (n+1)位格雷码中的后2n个码字等于n位格雷码的码字,按逆序书写,加前缀1
- n+1位格雷码的集合 = n位格雷码集合(顺序)加前缀0 + n位格雷码集合(逆序)加前缀1
import java.util.*;
public class GrayCode {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n= sc.nextInt();
System.out.println(Arrays.toString(getGray(n)));
}
private static String[] getGray(int n) {
if(n == 1){
return new String[]{"0","1"};
}else{
String[] temp = getGray(n-1);
String[] result= new String[temp.length*2];
for(int i = 0; i < temp.length;i++)
result[i] = "0"+temp[i];
int i,j;
j = temp.length - 1;
for( i = 0; i < temp.length && j>= 0;i++,j--)
result[i+temp.length] = "1"+temp[j];
return result;
}
}
}
最后
以上就是陶醉大炮为你收集整理的生成格雷码生成格雷码的全部内容,希望文章能够帮你解决生成格雷码生成格雷码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复