from itertools import groupby, islice
def morris():
morris = '1'
yield morris
while True:
morris = groupby(morris)
morris = ((len(list(group)), key) for key, group in morris)
morris = ((str(l), k) for l, k in morris)
morris = ''.join(''.join(t) for t in morris)
yield morris
print list(islice(morris(), 10))
Прежде всего я хотел бы сделать итератор бесконечным, и пусть потребитель решить, сколько он хочет. Таким образом, он мог либо получить каждое число морриса, которое короче, чем х, либо первые числа х и т. Д.
Тогда, очевидно, нет необходимости хранить весь список предыдущих чисел morris в списке, поскольку рекурсия только n := f(n-1)
в любом случае.
И наконец, использование itertools для придания ему функционального прикосновения всегда стоит подпрыгнуть или два;) Я разделил выражение генератора на несколько строк, чтобы сделать его немного легче на глазу.
Главное уродство в этом решении происходит из-за того, что len()
нельзя вызывать на итераторе и дает нам int, где нам нужна str. Другой hickup - вложенный str.join), чтобы снова свернуть все на str.
Если вы хотите, чтобы начать последовательность из произвольных чисел, определим функцию следующим образом:
def morris(morris=None):
if morris is None:
morris = '1'
[...]
Если вы хотите, чтобы повернуть вокруг этого генератора, вы можете написать это:
def morris():
morris = '1'
yield morris
while True:
print morris
morris = ''.join(''.join(t)
for t in ((str(len(list(group))), key)
for key, group in groupby(morris)))
yield morris
Я не уверен, что мне нравится разделение на две функции, но это, по-видимому, наиболее читаемое решение:
def m_groupby(s):
for key, group in groupby(s):
yield str(len(list(group)))
yield key
def morris():
morris = '1'
yield morris
while True:
morris = ''.join(m_groupby(morris))
yield morris
Надеюсь, вам понравится!
Это звучит как йо Вы спрашиваете о том, как тащит рыбу. Это сочетает в себе Monty Python и Morris Dancing ... :-) –
Если бы эта вещь не требовала не менее 10 символов, я бы просто ответил: D –
Почему вы оба уступаете() и сохраняете значения на [] ? – Javier