Вот вспомогательная функция для создания всех групп размером n
в последовательности.
def generate_n(seq, n, i, acc):
if i >= len(seq):
return acc
else:
acc.append(seq[i:i+n])
return generate_n(seq, n, i + n, acc)
Обратите внимание, это не чисто функционально, потому что я использую .append
, но без него вам пришлось бы использовать конкатенацию списков, что здесь очень неэффективно ... В общем, Python не предоставляет много эффективных структур для работы с типичными конструкциями чисто функционального программирования. Но чтобы быть «чисто функциональным», вы можете использовать:
def generate_n(seq, n, i, acc):
if i >= len(seq):
return acc
else:
return generate_n(seq, n, i + n, acc + [seq[i:i+n]])
Обратите внимание: Python не оптимизирует хвостовую рекурсию, поэтому это решение ограничено размером вашего стека (глубина более 1000 будет сложной. ). Но это было бы для упражнения (и вы бы никогда не писали бы такой код в производственной среде Python).
В любом случае, вот он в действии:
In [1]: def generate_n(seq, n, i, acc):
...: if i >= len(seq):
...: return acc
...: else:
...: acc.append(seq[i:i+n])
...: return generate_n(seq, n, i + n, acc)
...:
In [2]: generate_n("I am Jimmy", 2, 0, [])
Out[2]: ['I ', 'am', ' J', 'im', 'my']
In [3]: generate_n("I am Jimmy", 3, 0, [])
Out[3]: ['I a', 'm J', 'imm', 'y']
In [4]: generate_n("I am Jimmy", 1, 0, [])
Out[4]: ['I', ' ', 'a', 'm', ' ', 'J', 'i', 'm', 'm', 'y']
Решение затем сводится к подсчету для каждого n 1-> 3.