递归生成二进制反射格雷码:

需求:

​ 我们使用递归的方式来生成二进制的反射格雷码。

什么是格雷码?

​ 典型的二进制格雷码(Binary Gray Code)简称格雷码,因1953年公开的弗兰克·格雷(Frank Gray,18870913-19690523)专利“Pulse Code Communication”而得名,当初是为了通信,现在则常用于模拟-数字转换和位置-数字转换中。法国电讯工程师波特(Jean-Maurice-Émile Baudot,18450911-19030328)在1880年曾用过的波特码相当于它的一种变形。1941年George Stibitz设计的一种8元二进制机械计数器正好符合格雷码计数器的计数规律。

​ 格雷码(Gray code)曾用过Grey Code、葛莱码、葛兰码、格莱码、戈莱码、循环码、二进制反射码、最小差错码等名字,它们有的是错误的,有的易与其它名称混淆,建议不再使用它们。

粘自百度百科(手动狗头)

​ 总之,格雷码应用在各个场合,我们要做的就是生成它,它的特点就是相邻的两个数之间,只能有一位是不同的,这个需要我们进行一点儿点儿小小的脑筋。

​ 基于下面的伪代码:

  • 看到这伪代码我都傻了,因为一点儿也不好看,方法连个返回值都不给,还要自己设计,太操蛋了。

​ 因为我用的是Java,所以对于这个问题设计的返回值是List< String >。具体代码如下

/*** @program:算法库* @description:二进制反射格雷码的生成类*/
public class BinaryReflectedGrayCode {public List<String> BRGC(int n){List<String> L1;if(n==1){L1 = new ArrayList<String>();L1.add("0");L1.add("1");return L1;}else{L1 = new ArrayList<String>(BRGC(n-1));List<String> L2 = new ArrayList<>();int len = L1.size();for (int i = 0; i < len; i++) {L2.add("1"+L1.get(len-i-1));}for(int i=0;i<len;i++){String s = L1.get(i);s = "0"+s;L1.remove(i);L1.add(i,s);}int len2 = L2.size();for (int i = 0; i < len2; i++) {L1.add(L2.get(i));}return L1;}}
}

具体的步骤是:

  • 因为是一个递归算法,所以我们要先规定递归的终点,也就是我们的初始条件,当n==1的时候,我们返回0和1两个结果
  • 后面就根据伪代码给的提示,一步一步操作即可。

​ 这里在反转这个List表单的时候,可以使用Collections.reverse(参数),进行操作,但是这个方法的返回值就void,所以最后还是返回到我们的参数中去。

​ 而在后续的步骤中,我们传进去的操作还有用,所以我们不可以将其做一个替换,那样操作的开销太大了。

public static void reverse(List<?> list) {int size = list.size();if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)swap(list, i, j);} else {// instead of using a raw type here, it's possible to capture// the wildcard but it will require a call to a supplementary// private methodListIterator fwd = list.listIterator();ListIterator rev = list.listIterator(size);for (int i=0, mid=list.size()>>1; i<mid; i++) {Object tmp = fwd.next();fwd.set(rev.previous());rev.set(tmp);}}
}
  • 这里附上Java源码中对于这个方法的实现,还是对其底层进行了交换,所以我们没办法将其这样使用。

​ 故这里实现交换的是使用的循环,直接将其循环遍历之后,保存在我们的L2的集合中,再对L1其中的元素进行更新,这里的这个更新,应该是没有库函数可以使用,于是我们按照更新的常规操作来写,先移除再赋值,这一个操作之后,就完成了我们需要做的事情

​ 最后就是将我们的L1和L2进行合并即可,这里就遍历L2,将L2添加到L1当中。

可能,大概,也许是比较简单的一种方案了。

生成二进制反射格雷码相关推荐

  1. 减治法在生成子集问题中的应用(JAVA)--递归、二进制反射格雷码

    减治法在生成组合对象问题中的应用 生成子集问题:经典的背包问题就是求解一个最优子集的问题,这里我们来讨论一个更简单的问题.对于任意一个集合来说,它都存在2^n个子集(一个集合所有的子集集合称为幂集). ...

  2. 二进制和格雷码转换方法及程序

    二进制和格雷码转换方法及程序 1 格雷码介绍 2 二进制转格雷码 3 格雷码转二进制 1 格雷码介绍 格雷码(Gray code)是1880年由法国工程师Jean-Maurice-Emlle Baud ...

  3. (88)FPGA面试题-使用Verilog HDL编写二进制转格雷码

    1.1 FPGA面试题-使用Verilog HDL编写二进制转格雷码 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-使用Verilog HDL编写二进制 ...

  4. 自然二进制与格雷码的转换

    自然二进制:Bn-1Bn-2-.B2B1B0 格雷码      :Gn-1Gn-2-G2G1G0 自然二进制转格雷码公式: Gi = Bi ,i = n-1 Gi = Bi xor Bi+1 ,i = ...

  5. 【FPGA实验2】二进制转为格雷码

    关于FPGA入门实验2--二进制到格雷码的转换的一个记录 实验中作用到的仪器信息: 芯片商家:ALTERA 编程软件:Quartus II 试验箱上的芯片型号:EP4CE6E22C8N 快速导航

  6. 二进制与格雷码之间的转换的Verilog实现(更多一点的讨论)

    目录 前言 二进制码转换为格雷码的方法 格雷码转换为二进制码的过程 更多一点讨论之generate for 更多一点讨论之for 最后对格雷码的介绍 前言 以前的博客也有写这方面的内容,只是没有显式的 ...

  7. 《逻辑与计算机设计基础(原书第5版)》——1.7 格雷码

    1.7 格雷码 当我们采用二进制编码进行向上或向下计数时,每次计数会导致二进制值向下一个值变化,而每次变化时,二进制编码中需要翻转的位的个数是不一样的.如表1-7所示,表左边列出的是二进制编码的八进制 ...

  8. 格雷码基础和生成的几种方法

    1 格雷码: 1.1 格雷码引言: 在数字系统中,常要求代码按一定顺序变化. 在机器视觉里面,编码结构光也是按照一定的顺序进行变化,最常用的就是Binary,但是,二进制的纯粹的编码,由于二进制的进制 ...

  9. 3D 机器视觉 02 - FPGA生成N位元格雷码

    前言,FPGA是机器视觉里面经常用的的控制逻辑单元,并行处理速度快. 格雷码的生成方法中,通过异或的逻辑变化生成格雷码是最适合的方式. 举例一个位元为3的格雷码: 下面为一个位元为4的格雷码对比图 1 ...

最新文章

  1. 2018新年快乐 !(附幸运读者名单)
  2. python macd背离_Python 精简多品种 MACD 趋势策略
  3. 关于如何在你的Web项目中实现对空间数据访问权限的控制(一)
  4. SAP ABAP二分查找(binary search)实际问题的深度分析
  5. 原神服务器维护后抽奖池会更新吗,原神:武器池改动,玩家的诉求再次得到反馈!PS端将与官服互通!...
  6. 待机、休眠、睡眠的区别和优缺点
  7. scratch数学编程100例_《scratch编程+数学》课程:编程实现数字黑洞冰雹猜想
  8. SDL2源代码分析5:更新纹理(SDL_UpdateTexture())
  9. centos7 卸载 jdk
  10. tensorflow学习之常用函数总结:tensorflow.argmax()函数
  11. 爱搞事情:关于黑苹果Intel网卡驱动这件事
  12. 计算机桌面图片怎么设置大小,电脑桌面的图标大小怎么调整?
  13. 鸿蒙系统手机电脑互传文件,【手机篇】巧借局域网,便捷实现手机电脑间的文件传输...
  14. 中国移动云能力中心IaaS产品部2021年招聘
  15. Unity--AnimationCurve动画曲线
  16. QT的QList排序
  17. ctf——如来十三掌
  18. html九宫格布局原理,了解CSS九宫格布局的几大实现方法
  19. Polyhedral Compilation及ISL学习资料
  20. 性能测试利器 — 全链路监控工具Pinpoint安装教程(非docker版本)

热门文章

  1. 搭建智能DNS---就近原则
  2. Echarts 开源,免费商用图表控件使用整理
  3. Windows上安装Linux
  4. SAP FICO 财务月结--自动清账
  5. 医疗行业大数据医疗分析案例
  6. LTE-A载波聚合技术(14)---CQI的TDM和CDM
  7. Python基础——数据类型—元组
  8. 死链提交为什么不能提交 html文件,死链提交有什么用(如何处理网站死链)
  9. Java动态代理的原理
  10. Python之建模规划篇--整数规划