<pre><code>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))
</code></pre>
<p>首先,我让迭代器无限大,让消费者决定他想要多少。这样他就可以得到小于x的每个morris数或前x个数,等等</p>
<p>然后显然不需要将以前morris数字的整个列表存储在一个列表中,因为不管怎样递归都只是<code>n := f(n-1)</code>。在</p>
<p>最后,使用itertools给它一个功能性的触感总是值得一两个极客的点;)我把生成器表达式分成几行,使它看起来更简单一些。在</p>
<p>这个解决方案的主要缺点是不能在迭代器上调用<code>len()</code>,并在需要str的地方给我们一个int。另一个问题是嵌套的结构连接)再把整件事弄平。在</p>
<p>如果要从任意数字开始序列,请定义如下函数:</p>
^{pr2}$
<p>如果你想打开发电机,你可以这样写:</p>
<pre><code>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
</code></pre>
<p>我不确定是否喜欢将其拆分为两个函数,但这似乎是最具可读性的解决方案:</p>
<pre><code>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
</code></pre>
<p>希望你喜欢!在</p>