C程序设计的抽象思维-递归过程-格雷码

【问题】

每一对相邻整数的二进制表示只有一位发生变化,这种编码称为Gray码。

如下所示3位的Gray码:

000 0
001 1
011 2
010 3
110 4
111 5
101 6
100 7

要产生N位的Gray码,所需的递归思想概括如下:

1. 写出N-1位的Gray码。

2. 以相反的顺序在该Gray码下重写一遍。

3. 在第一步得到的Gray码前加0,在第二步得到的Gray码前加1。

继续以3位Gray码为例,推导过程如下所示:

【代码】

#include <stdio.h>
#include <stdlib.h>

#define MAX 1024
#define M 10

int a[MAX][M];
/*****************************************/
/* 前半部分格雷码存入数组                */
/*****************************************/
void ForeCode(int forenum, int n)
{
	int i, j;
	for(i = 0; i <= forenum; i++)/*双重循环使n-1位格雷码后移一位*/
		for(j = n - 2; j >= 0; j--)
			a[i][j + 1] = a[i][j];
	for(i = 0; i <= forenum; i++)/*前半部分第0位为0*/
		a[i][0] = 0;
}
/*****************************************/
/* 后半部分格雷码存入数组                */
/*****************************************/
void BackCode(int backbegin, int backend, int n)
{
	int i, j;
	for(i = 0; i < backbegin; i++)/*后半部分与前半部分对称*/
		for(j = 1; j < n; j++)
			a[backend - i - 1][j] = a[i][j];
		for(i = backbegin; i < backend; i++)/*后半部分第0位为1*/
			a[i][0] = 1;
}
/*****************************************/
/* 生成格雷码                            */
/*****************************************/
void GrayCode(int nBits)
{
	int i, k, m = 1;
	if(nBits == 1)
	{
		a[0][0] = 0;
		a[1][0] = 1;
	}
	else
		GrayCode(nBits - 1); /*递归调用*/
	for(i = 0; i < nBits; i++)
		m = 2 * m;    /*n位的Gray码总共有2**n次方个*/
	k = m / 2;
	ForeCode(k - 1, nBits);
	BackCode(k, m, nBits);
}

/****************************************/
/* 打印格雷码                           */
/****************************************/
void PrintGrayCode(int nBits)
{
	int i, j, m = 1;
	for(i = 0; i < nBits; i++)
		m = 2 * m;
	for(i = 0; i < m; i++)
	{
		for(j = 0; j < nBits; j++)
			printf("%d", a[i][j]);
		printf("\n");
	}
}

int main()
{
	int nBit;
	nBit = 3;
	GrayCode(nBit);
	PrintGrayCode(nBit);
	return 0;
}

C程序设计的抽象思维-递归过程-格雷码,布布扣,bubuko.com

时间: 2024-08-06 03:46:18

C程序设计的抽象思维-递归过程-格雷码的相关文章

C程序设计的抽象思维-递归过程-砝码称重

[问题] 在狄更斯时代,商人们用砝码和天平来称量商品的重量,如果你只有几个砝码,就只能精确地称出一定的重量.例如,假定只有两个砝码:分别是1kg和3kg.只用1kg的砝码可以称出1kg重量的商品,只用3kg的砝码可以称出3kg重量的商品.1kg和3kg的砝码放在天平同一边可以称出4kg重量的商品,放在不同边可以称出2kg重量的商品.因此利用这两个砝码,我们可以称出重量分别为1.2.3.4kg的商品. 编写一个递归函数: bool IsMeasurable(int target, int weig

C程序设计的抽象思维-递归入门

[斐波那契序列] 序列中的每一个新项都是它前两项的和. 0    1     1     2     3      5      8       13       21       34      55       89       144  ---- 数学表达式表示序列中的一个新项:   tN = tN-1 +  tN-2 像这种类型的表达式,序列中的每一个元素都是由先前的元素来确定,这种序列称为递归关系. 斐波那契序列的完整定义如下: tn =  n       n= 0 或者 n= 1 t

构造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){

格雷码那点事——递归非递归实现

简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码.在数字系统中,常要求代码按一定顺序变化.例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100.1111等).在特定情况下可能导致电路状态错误或输入错误.使用格雷码可以避免这种错误.格雷码有多种

格雷码C++递归实现

昨天参加腾讯的笔试,结果答的一塌糊涂,大题第一题是关于格雷码的递归实现的,当时没写出来,今天查了下资料试着用C++实现一下. #include <iostream> #include <cmath> #include <string> using namespace std; unsigned int *uIntGaryCode(int N);//二进制格雷码 string *sGaryCode(int N);//字符串型格雷码 int main() { int N;

gray code 格雷码 递归

格雷码 the n-1 bit code, with 0 prepended to each word, followd by the n-1 bit code in reverse order, with 1 prepended to each word. public class GrayCode{ public static void gray(int n, String prefix) { if(n == 0) System.out.println(prefix); else { gra

格雷码的实现

问题:产生n位元的所有格雷码. 格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同. 例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 . 如果要产生n位元的格雷码,那么格雷码的个数为2^n. 假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右边的位元值:第二步,改变右起第一个为1的位元的左边位元:第三步,第四步重复第一步和第二步,直到所有的格雷码产生完毕(换句话说,已

生成格雷码 转自leetcode

在一组数的编码中,若两个相邻的代码中只有一个二进制数不同,则称这种编码为格雷码. 下面尝试使用递归的方法来生成格雷码 vector<int> GrayCode(int n){//n表示格雷码的位数 if(n==0) return vector<int>(1)//返回只有一个0的容器 vector<int> res=GrayCode(n-1);//采用递归方法 for(int i=res.size()-1 ; i >=0 ;i-- )//采用从后往前的方式 res.

[腾讯]生成格雷码

时间限制:3秒 空间限制:32768K 热度指数:24655 本题知识点: 递归 题目描述 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码. 给定一个整数n,请返回n位的格雷码,顺序为从0开始. 测试样例: 1 返回:["0","1"] 思路: class GrayCode {public:    vector<string> getGray(int