3

これまでのところ、グレーコードを作成する関数があり、基本的に次の順番であるグレーコード「プラスワン」を返す関数を作成する必要があります。したがって、D = (0,0,1,1) の場合、(0,0,1,0) を返す必要があります

私は持っている

def gray(x):
    if x:
        return ['0' + x[0]] + gray(x[1:]) + ['1' + x[0]]
    else:
        return []

def graycode(n):
    if n:
        return gray(graycode(n-1))
    else:
        return ['']

そして最後に、

def GrayFinal(D):
    z = ''.join(map(str,D))
    str(z)
    if z in graycode(len(D)):
        return graycode(len(D))[z+1]
    else:
        return ['']

Zth+1 エントリを返す方法がわかりません

4

2 に答える 2

1

私があなたの質問を正しく解釈した場合、あなたの質問の核心は実際にはグレイコードとは何の関係もありませんが、より一般的な質問とは関係ありません。それ?

残念ながら、私は今のところかなり頭が死んでいる解決策しか思いつくことができません。

def next_elem(elem, input_list):
    index = input_list.index(elem)
    return input_list[index + 1]

これは、エラーチェックをまったくサポートしていないことに注意してください。これは、コードの本体で行われると想定しています。それをコードに投げ込むと、次のようになります。

def GrayFinal(D):
    z = ''.join(map(str,D))
    try:
        return next_elem(z, graycode(len(D)))
    except ValueError:
        # Doesn't look like z was ever in the Gray code generated
        return ['']
    except IndexError:
        # The next element is beyond the last element of the array!
        return next_elem('0' + z, graycode(len(D) + 1))
于 2013-11-01T19:34:53.363 に答える
0

ここで私が聞いたことがあります:

>>> bin2gray = lambda x: (x >> 1) ^ x # create graycode
>>> for i in range(10):
    print(bin(bin2gray(i))[2:].zfill(4))


0000
0001
0011
0010
0110
0111
0101
0100
1100
1101

>>> def gray2bin(g):
    bits = list(map(int, bin(g)[2:]))
    n = [0]
    for bit in bits:
        if not n[-1]:
            n.append(bit)
        else:
            n.append(1 - bit)
    return sum([n[i] << (-1 - i) for i in range(-len(n), 0)])

>>> def inc(g):
    return bin2gray(gray2bin(g) + 1)

int ではなく文字列を操作する場合は、inc 関数を調整する必要があります。

于 2013-11-01T18:57:50.967 に答える