Это эффективный способ генерации последовательности Туэ-Морса в Python?

Является ли использование генератора, как в коде ниже, эффективным способом генерации последовательности Туэ-Морса в Python?

# generate the Thue-Morse sequence
def genThueMorse():
    # initialize
    tms = '0'
    curr = 0
    while True:
        # generate next sequence
        if curr == len(tms):
            tmp = ''
            for i in range(len(tms)):
                if tms[i] is '0':
                    tmp += '1'
                else:
                    tmp += '0'
            tms += tmp
        yield tms[curr]
        curr +=1

Вот код, чтобы проверить это:

tms = koch.genThueMorse()
while True:
   print(next(tms))

3 ответа

Решение

Это сжато, это "эффективно"?

import itertools

def genThueMorse():
    for n in itertools.count():
        yield (1 if bin(n).count('1')%2 else 0)

Я думаю, что генератор будет довольно эффективным. Я бы пошел на что-то вроде этого:

from itertools import count, izip

def genThueMorse():
    tms = [0]
    invert = [1, 0]
    for tm, curr in izip(tms, count()):
        yield str(tm)
        if curr == len(tms) - 1:
            tms += [invert[c] for c in tms]

Помощь в дополнении других ответов: Если вы хотите только вычислить n-ую цифру в последовательности, используйте:

lambda n: bin(n).count("1") % 2

или если предпочитаете функцию:

def calculate_nth(n):
  return bin(n).count("1") % 2

Пример:

f = lambda n:  bin(n).count("1") % 2
f(0) # This will return 0
f(1) # This will return 1
f(2) # This will return 1
...
f(10) # This will return 0

Это можно проверить с помощью последовательности: 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0

Другие вопросы по тегам