【问题标题】:grey codes using 2d arrays (C)使用二维数组的格雷码 (C)
【发布时间】:2015-04-11 04:10:31
【问题描述】:

我的任务是使用递归打印出灰色代码。用户在0-8 之间输入一个位值,因此您可以拥有的strings 的最大数量是256 (2^8)。

我已经完成了基本情况,但我不知道我会为 else 部分做什么。

到目前为止我的代码:

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

void gcodes (int n) {
    char bits[256][8];
    int i, j;
    int x = pow (2, n);

    if (n == 1) {
        bits[0][0] = '0';
        bits[1][0] = '1';
    } else {
        gcodes (n-1);
    }

    for (i=0; i<x; i++) {
        for (j=0; j<n; j++) {
            printf("%c", reverse[i][j]);
        }
    printf("\n");
    }
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("Invalid number of arguments\n");
        return 0;
    }

    int n;
    n = atoi (argv[1]);

    if (n > 8 || n <= 0) {
        printf("Invalid integer\n");
        return 0;
    }

    gcodes (n);
}

【问题讨论】:

    标签: c gray-code


    【解决方案1】:

    格雷码从一个数字到下一个连续数字只能有一位变化。并且在整个序列中,没有重复的值。

    鉴于该标准,有几种可能的格雷码实现。

    有几个死端序列,其中值开始正常,然后失败,

    通过代码计算格雷码需要大量的实验。

    实际上,从网上简单地找到一个有效的格雷码序列,然后将其粘贴到任何需要格雷码序列的程序中要容易得多。

    大多数情况下,输入是一个灰色编码的轮子,读取它以确定轮子是否移动,而不是代码中生成的东西。

    但是,如果我正在实现格雷码生成器,我希望它在最后生成的值和建议的新/下一个值之间执行异或,如果这是有效的(只有一点改变)我会搜索现有的值表,以确保它不是重复的。

    这个 SO 问题提出了一种可能的算法:

    Non-recursive Grey code algorithm understanding

    答案在下面重复:

    你所有四个问题的答案是这个算法不是从较低的 n 值开始的。它生成的所有字符串都具有相同的长度,并且第 i 个(对于 i = 1, ..., 2n-1)字符串是从第 (i-1) 个字符串生成的。

    这里是 n = 4 的前几个步骤:

    从 G0 = 0000 开始

    要生成 G1,翻转 G0 中的第 0 位,因为 0 是 1 = 0001b 的二进制表示中最低有效 1 的位置。 G1 = 0001。

    要生成 G2,翻转 G1 中的第 1 位,因为 1 是 2 = 0010b 的二进制表示中最低有效 1 的位置。 G2 = 0011。

    要生成 G3,翻转 G2 中的第 0 位,因为 0 是 3 = 0011b 的二进制表示中最低有效 1 的位置。 G3 = 0010。

    要生成 G4,翻转 G3 中的第 2 位,因为 2 是 4 = 0100b 的二进制表示中最低有效 1 的位置。 G4 = 0110。

    要生成 G5,翻转 G4 中的第 0 位,因为 0 是 5 = 0101b 的二进制表示中最低有效 1 的位置。 G5 = 0111。

    【讨论】:

      【解决方案2】:

      既然你定义了

          char bits[256][8];
      

      在函数gcodes() 内具有自动存储持续时间,数组的生命周期在从函数返回时结束,因此您会丢失递归调用的结果。因此,至少定义它

          static char bits[256][8];
      

      如果您想保留生成的bits 以供在gcodes() 之外使用,则可以在全局范围内使用。


      由于在标准格雷码中最低有效位(位 0)遵循 0110 的重复模式,因此在基本情况下设置完整模式很方便,即使 n = 1。

      对于第i位码j,其中j > 0,其值可以取自位j-1 代码 i/2.

      这导致完成的功能:

      void gcodes(int n)
      {
          static char bits[256][8];
          int i, j, x = pow(2, n);
      
          if (n == 1)
          {
              bits[0][0] = '0';
              bits[1][0] = '1';
              bits[2][0] = '1';
              bits[3][0] = '0';
          }
          else
          {
              gcodes(n-1);
              // generate bit j (from n-1 down to 1) for codes up to x-1
              for (i=0, j=n; --j; i=x/2)
                  for (; i<x; i++)
                      bits[i][j] = bits[i/2][j-1];
              // replicate bit 0 for codes up to x-1
              for (; i<x; i++)
                  bits[i][0] = bits[i%4][0];
          }
      
          for (i=0; i<x; i++, printf("\n"))
              for (j=n; j--; )
                  printf("%c", bits[i][j]);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-25
        • 1970-01-01
        • 2013-04-11
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 1970-01-01
        相关资源
        最近更新 更多