作者Festung (die Festung Iserlon)
看板Electronics
标题Re: [问题]请问一下有什麽好方法可以找出gray code
时间Tue Nov 13 23:57:58 2007
※ 引述《cbscloud (v想做的事快点完成)》之铭言:
: 请问一下有什麽好方法可以找出gray code
: 1 2 3
: 2bit 3bit 4bit
: 00 000 0000
: 01 001 0001
: 10 010 0010
: 11 011 0011
: 111 0111
: 110 0110
: 101 0101
: 100 0100
: 1100
: 1101
: 1110
: 1111
: 1011
: 1010
: 1001
: 1000
: 请问一下之後要怎麽分别出gray code
: 上课有教两两相邻,只有一个bit不一样,其他bit都一
: 样(且为2的倍数)
: 可是我用这个方法 有点怪怪的
: 不知道有没有其他高手可以帮我解说一下~!
: 谢谢~!
这种问题是Combinatorial Generation产生组合的问题的一种,
你可以在Frank Ruskey's Combinatorial Generation Resources网站,
找到这类的演算法与程式码。
http://www.cs.sunysb.edu/~algorith/implement/ruskey/implement.shtml
在此把产生Gray Code的范例程式贴於下供您参考:
/* Gray Code Generation Algorithm Example
*
----------------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdlib.h>
/* specify the algorithm used (0 = recursive, 1 = iterative) */
#define GRAY_ALG 1
/* globals - accessed by sequence generation functions */
int *sequence; /* array containing the sequence for output */
int slength; /* sequence length */
/* --- seq_out() ---
* Output the sequence array.
*/
void seq_out() {
int i;
printf("%d", sequence[slength-1]);
for(i = slength-2; i >= 0; i--) printf(" %d", sequence[i]);
putchar('\n');
}
/* --- gray1_rr() ---
* Recursive sequence generation function.
*/
void gray2_rr(int n);
void gray1_rr(int n) {
if(n > 0) {
sequence[n-1] = 0;
gray1_rr(n-1);
sequence[n-1] = 1;
gray2_rr(n-1);
}
else {
seq_out();
}
}
/* --- gray2_rr() ---
* Recursive sequence generation function.
*/
void gray2_rr(int n) {
if(n > 0) {
sequence[n-1] = 1;
gray1_rr(n-1);
sequence[n-1] = 0;
gray2_rr(n-1);
}
else {
seq_out();
}
}
/* --- seq_i() ---
* Iterative sequence generation function.
*/
void gray_i(int n) {
int *up = malloc((n+1) * sizeof(int));
int i;
/* initialise sequence */
for(i = 0; i < n; i++) sequence[i] = 0;
/* algorithm */
for(i = 0; i < n+1; i++) up[i] = i+1;
do {
seq_out();
i = up[0];
sequence[i-1] = !sequence[i-1];
up[0] = 1;
up[i-1] = up[i];
up[i] = i+1;
} while(i < n+1);
}
/* --- gensequence() ---
* Generate sequence of specified length n.
*/
void gensequence(int n) {
sequence = malloc(n * sizeof(int));
slength = n;
#if GRAY_ALG == 0
gray1_rr(n);
#elif GRAY_ALG == 1
gray_i(n);
#endif
free(sequence);
}
/* --- main program --- */
int main(void) {
int n;
printf("Sequence length: ");
scanf("%d", &n);
gensequence(n);
return 0;
}
--
史役初,德步71师攻苏军谷仓。
三日後,守军电:「呜呼,缺粮也!请援之。」史达林覆电,云:「战,可解饥也。」
复三日,守军电:「呜呼,无水也!请援之。」史对曰:「汝有弹药,可以智取也!」
寻二日,守军电:「呜呼,弹药已尽矣!」史答曰:「卿马革裹屍,苏联不胜感激!」
守军曰:「敢问高堂卡好!」此後不复回电求援。
——摘自《中华民国史记‧北狄列传‧苏联》 ψ Prof. MRZ
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.70.85.252
1F:推 cbscloud:谢谢~! 11/14 08:02