擅长:python、mysql、java
<p>一个关键问题是:</p>
<pre><code>if solutie:
</code></pre>
<p>正在测试<em>函数</em>的真实性,它将始终是<code>True</code>:</p>
^{pr2}$
<p>而不是它返回的值的真实性;您应该:</p>
<pre><code>if solutie():
# ^ note parentheses
</code></pre>
<p>而且,您的函数都没有参数,因此您完全依赖变量范围进行访问。这是不明智的,并且使代码很难调试-您不能单独测试任何函数。作为一个简单的例子,请比较:</p>
<pre><code>def solutie():
return k == n
</code></pre>
<p>与</p>
<pre><code>def solutie(k, n):
return k == n
</code></pre>
<p>对于前者,测试非常困难-<code>k</code>和{<cd3>}是什么?他们从哪里来的?对于后者,这是一个简单的问题</p>
<pre><code>assert solutie(1, 1)
assert not solutie(1, 2)
</code></pre>
<p>您的主要问题源于此:<em>因为<code>k</code>是不可变的,所以除了<code>back</code>之外,在每个函数中总是使用相同的值</em>。尽管您在<code>back</code>中分配了<code>k += 1</code>,但其他函数(例如<code>valid</code>)仍在从外部范围使用<code>k == 0</code>。如果您将每个函数更改为使用显式参数和返回值,例如:</p>
<pre><code> def successor(x, k, n):
...
return True # use booleans rather than 0 or 1
...
avemsuccesor = succesor(x, k, n)
</code></pre>
<p>您将很快发现<code>k</code>超出范围,导致<code>IndexError</code>。我不会在这里重写所有的东西——我将留下重构代码来显式地传递值,并解决随后作为练习出现的错误。在</p>