1

私の課題は、再帰を使用してグレー コードを出力することです。ユーザーは の間にビット値を入れます。したがって、持てる0-8最大量は 256 (2^8) です。strings

基本ケースは完了しましたが、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);
}
4

2 に答える 2

0

グレー コードは、ある数値から次の連続する数値への 1 ビットの変化のみを持つことができます。シーケンス全体で、値の繰り返しはありません。

その基準を考えると、考えられるグレイ コードの実装がいくつかあります。

値が正常に始まり、その後失敗する、いくつかの行き止まりのシーケンスがあります。

コードを介してグレーコードを計算するには、多くの実験が必要です。

実際には、ネットから有効なグレイ コード シーケンスを見つけて、それをグレイ コード シーケンスを必要とするプログラムに貼り付ける方がはるかに簡単です。

ほとんどの場合、入力は、コードで生成されたものではなく、ホイールが動いたかどうかを判断するために読み取られるグレー コードのホイールです。

ただし、グレーコードジェネレーターを実装している場合、最後に生成された値と提案された新しい/次の値の間で排他的論理和を実行することを期待し、それが有効な場合 (1 ビットのみが変更された場合)、既存のテーブルを検索します。値が重複していないことを確認します。

this SO question は、可能なアルゴリズムを示唆しています:

非再帰的グレイ コード アルゴリズムの理解

そして答えは以下に繰り返されます:

あなたの 4 つの質問すべてに対する答えは、このアルゴリズムはより低い値の 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 の 2 進数表現で最下位の 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。

于 2015-04-11T04:27:40.137 に答える