擅长:python、mysql、java
<p>好,让我们看看lambda函数生成的<code>ast</code>:</p>
<pre><code>import ast
tree = ast.parse('lambda S,b : (g(S[1:],b),S)[len(S)==b]')
ast.dump(tree)
</code></pre>
<p>在vim中完成一些格式化后,我得到了:</p>
^{pr2}$
<p>如您所见,在调用lambda时,代码执行的第一件事是创建元组,然后直接对同一lambda执行递归调用(<code>Call(Name('g'...</code>)。在</p>
<p>首先要做的是调用,因为空列表的切片仍然是空列表:</p>
<pre><code>>>>[1][1:]
[]
>>>[][1:]
[]
</code></pre>
<p>这意味着<code>g(S[1:])</code>将减少您的列表,直到空列表,然后继续用空列表不断调用<code>g</code>。这是因为解析器执行语句的方式。首先执行的是递归方法调用,因此它不会停止。在</p>
<p>我的观点是:基本情况不适用于递归。在</p>
<p>希望这能给这个问题带来更多的启发。在</p>