擅长:python、mysql、java
<p>我不喜欢前面给出的使用<code>product</code>的答案,因为在python文档中查看它的实现,它似乎在开始产生结果之前将整个事情扩展到内存中的一个列表中。</p>
<p>这对你的案子很不利,因为正如agf自己所说,这里的排列数量巨大(远远超过一百万)。在这种情况下,创建了<code>yield</code>语句,这样就可以动态生成大量列表,而不是在内存中跨越(我也不喜欢在<code>range</code>中完全适用于<code>xrange</code>的浪费性<code>range</code>)。</p>
<p>我想要这样的解决方案:</p>
<pre><code>def generate(chars, length, prefix = None):
if length < 1:
return
if not prefix:
prefix = ''
for char in chars:
permutation = prefix + char
if length == 1:
yield permutation
else:
for sub_permutation in generate(chars, length - 1, prefix = permutation):
yield sub_permutation
</code></pre>
<p>这样,内存中的所有跨度都是一个递归堆栈“n”深,其中“n”是排列的长度(在本例中为4),每次只返回一个元素。</p>
<p>chars是一组可供选择的字符,长度为4,其用法与products非常相似,只是它在运行时不跨越内存中的整个列表。</p>