擅长:python、mysql、java
<p>这段代码是一个<em>尾部递归</em>的情况,也就是说,它可以看作是执行迭代的递归方式。请注意,Python实际上并不是这样解释的(这是一种优化),但是这样看还是有帮助的:</p>
<p>看看<code>PrimeHelper</code>的每个递归调用对<em>m</em>的值是如何相同的,但是对于<em>j</em>的值与在上一次调用中的值相比少了一个。在</p>
<p>因此,代码与此变体相当:</p>
<pre><code>def RecIsPrime(m):
for j in range(m-1, 1, -1):
if m % j == 0:
return False
return m > 1
</code></pre>
<p>在这个变量中,每次迭代都对应于原始代码中的递归调用。请注意,<code>return False</code>断开了链,这是由<code>m % j != 0</code>在原始代码中完成的,即它有两个用途:</p>
<ol>
<li>返回<code>False</code></li>
<li>不再呼叫<code>PrimeHelper</code></li>
</ol>
<p>需要注意的是,当您使用小于等于1的参数调用<code>RecIsPrime</code>时,这两个变量的行为方式不同。在这些情况下,递归代码可以产生<em>“除以零”</em>错误(当<code>RecIsPrime(1)</code>)或永远递归(例如<code>RecIsPrime(-1)</code>或任何更小的值)。这是个虫子。要更正它,请更改:</p>
^{pr2}$
<p>通过</p>
<pre><code>return m > 1 and PrimeHelper(m, m -1)
</code></pre>
<p>这也修正了1的情况:1是否是质数不仅仅是一个值得商榷的问题:它绝对不是。在</p>