Это эффективный способ генерации последовательности Туэ-Морса в 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