<p><em>注意:这个答案给出了正确的输出,但我还没有弄清楚它为什么有效</em></p>
<p>你应该问的问题不是</p>
<blockquote>
<p>"why do I get five 'a's?"</p>
</blockquote>
<p>但是</p>
<blockquote>
<p>"Why don't I get ten 'a's?"</p>
</blockquote>
<p>是的。此算法的预期输出为:</p>
<pre><code>aaaaaaaaaa
aaaaaaaaab
aaaaaaaaac
aaaaaaaaad
aaaaaaaaae
...
</code></pre>
<p>但你的开始</p>
<pre><code>aaaaj@bc
aaaaaaj@bd
aaaaaaj@be
aaaaaaj@bf
</code></pre>
<p>事实上,一些非常令人担忧的事情正在发生。输出甚至不是确定性的,每次运行都会得到不同的结果!我还没弄明白,所以请评论人士帮忙。如果我在debug中运行这个,然后慢慢地点击,我就会得到正确的输出。我还可以通过在函数中添加一个小sleep来纠正输出,如下所示:</p>
<pre><code>import time
def printPwd(set, k):
n = len(set)
pwdRec(set,"", n, k)
def pwdRec(set, prefix, n, k):
time.sleep(0.000001)
if k==0:
print(prefix)
return
for i in range(n):
nPrefix = prefix + set[i]
nk = k-1
pwdRec(set, nPrefix, n, nk) #alex067's change here plus my change
chars = list("abcdefghijklmno.@-_&")
length = 10
printPwd(chars, length)
</code></pre>
<p>看起来我们好像被某种可变类型或非原子操作搞砸了,但我还没找到。你知道吗</p>
<p><strong>alex067的评论
进行@alex067建议的更改一开始似乎可以修复输出,但在前两个循环之后会出现超出范围的错误,因为您的集合不再是<code>n</code>长的。实际上,您还遗漏了一些排列,其中第一个是<code>aaaaaaaaba</code>,因此它根本不是固定的,但至少是确定的。你知道吗</p>