`
BrokenDreams
  • 浏览: 253744 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
68ec41aa-0ce6-3f83-961b-5aa541d59e48
Java并发包源码解析
浏览量:100040
社区版块
存档分类
最新评论

一个小编程题-递归方式生成N位格雷码

 
阅读更多
        今天群友发了一个小编程题,使用递归的方式生成N位格雷码。
        首先了解了一下格雷码及其递归思路,但写起来还是调试了很久。
        代码如下:
	public static String[] createGrayCode(int n){
		String[] codes = new String[2 << (n - 1)];
		createGrayCode(codes, n);
		return codes;
	}
	
	private static void createGrayCode(String[] codes, int n){
		if(n == 1){
			codes[0] = "0";
			codes[1] = "1";
		}else{
			createGrayCode(codes, n - 1);
			int len = 2 << (n - 1);
			int half = len >> 1;
			for(int i = len - 1,j = 0; i >= 0; i--){
				if(i < half){
					codes[i] = "0" + codes[--j];
				}else{
					codes[i] = "1" + codes[j++];
				}
			}
		}
	}


运行一下:
	public static void main(String[] args) {
		String[] codes = createGrayCode(3);
		System.out.println(Arrays.toString(codes));
	}

结果如下:
[000, 001, 011, 010, 110, 111, 101, 100]
分享到:
评论

相关推荐

    腾讯2016研发工程师编程题及答案.pdf

    在编程领域,格雷码(Gray Code)是一种特殊的二进制编码方式,它的特点是任意两个相邻的代码之间只有一个位的差异。格雷码在数据传输、编码设计等领域有广泛应用,因为它可以减少由于传输错误导致的误码率。本题...

    PythonOJ 部分题目答案参考

    - 对于n+1位格雷码,可以通过以下步骤生成: - 从n位格雷码的前2^n个码字按顺序加上前缀0得到新的码字。 - 从n位格雷码的后2^n个码字按逆序加上前缀1得到新的码字。 - 这种方式保证了相邻码字之间的差异只有一位...

    腾讯2016研发工程师编程题

    给定一个整数n,要求使用递归方法生成n位的格雷码,并按照从0到最大值的顺序返回。 **示例:** 输入:1 输出:["0", "1"] **解题思路与代码分析:** 为了生成n位的格雷码,我们可以采用递归的方式: 1. 当n为1...

    算法设计与分析实验报告.pdf

    该序列由2^n个编码组成,每个编码为长度为n的二进制串,且相邻编码之间只有一个位不同。 1.5 实验实现 通过递归函数`get_grad(int n)`实现了格雷码的生成。算法首先将0和1添加到序列,然后对于n&gt;1的情况,递归地将...

    算法设计和分析实验报告.doc

    **代码设计**中,使用了一个递归函数`get_grad`来生成n位的格雷码。首先初始化序列,包含"0"和"1"这两个基础码字。接着,如果n大于1,程序会生成新的码字,通过将当前序列中的码字与下一个码字异或,再添加到序列中...

    2018蓝桥杯试题 (2).docx

    这个问题可以使用C语言来解决,使用位运算来生成格雷码序列。 知识点:C语言编程、位运算、格雷码 4. 调手表问题 这个问题考察了学生的编程能力和动态规划的应用。问题要求小明想知道,如果手表可以再添加一个...

    2018蓝桥杯试题范本模板.pdf

    题目要求填充完成生成格雷码的代码,关键在于找到最右边的1并处理它的左侧位,这可以通过`a & (-a)`找到最右侧的1,然后左移1位进行操作。 综合来看,这些题目涵盖了C语言的基础语法、递归算法的应用以及位操作在...

    2018年蓝桥杯试题(卷).pdf

    【知识点详解】 ...3. 位操作和格雷码:理解二进制位操作以及如何生成格雷码序列。 这些知识点在计算机科学和编程竞赛中非常常见,尤其是对于准备蓝桥杯这样的编程比赛来说,理解和掌握这些概念及算法至关重要。

    2018蓝桥杯精彩试题.docx

    有很多算法来生成格雷码。以下是较常见的一种:从编码全0开始生成。当产生第奇数个数时,只把当前数字最末位改变(0变1,1变0)当产生第偶数个数时,先找到最右边的一个1,把它左边的数字改变。 这道题考察了学生对...

    2018蓝桥杯试题 (2).pdf

    我们可以使用递归的方法来生成格雷码序列。以下是实现代码: ```c #include void show(int a, int n){ int i; int msk=1; for(i=0; i&lt;n-1; i++) msk=msk; for(i=0; i&lt;n; i++){ printf((a&msk)?"1":"0"); msk...

    史上最全最经典数据结构-100个经典算法

    1. **河内塔 (Towers of Hanoi)**: 这是一个经典的递归问题,通过三个柱子和若干个大小不一的圆盘,演示了如何在遵循特定规则(大盘子不能放在小盘子之上)的情况下,将所有圆盘从一个柱子移动到另一个柱子。...

    杭电ACM分类杭电ACM分类

    总之,【杭电ACM分类】是一个全面的编程竞赛学习资源集合,涵盖了算法、数据结构、数学等多个领域,对于提高编程技能和准备ACM竞赛具有极大的帮助。通过深入研究这些分类和相关文档,参赛者可以有的放矢地提高自己在...

    Concrete Mathematics: A Foundation for Computer Science (2nd Edition)

    7. **数学工具**:书中还介绍了一些重要的数学工具,如拉格朗日插值、傅里叶变换、格雷码和图论,这些都是解决复杂计算问题时的有力武器。 8. **解决问题的策略**:除了具体的数学知识,Knuth等人还传授了如何有效...

Global site tag (gtag.js) - Google Analytics