好的,让我们看看ast
lambda 函数生成:
import ast
tree = ast.parse('lambda S,b : (g(S[1:],b),S)[len(S)==b]')
ast.dump(tree)
在 vim 中完成一些格式化后,这就是我得到的:
Module(
[Expr(
Lambda(
arguments(
[Name('S', Param()), Name('b', Param())],
None,
None,
[]
),
Subscript(
Tuple(
[Call(
Name('g', Load()),
[Subscript(Name('S', Load()), Slice(Num(1), None, None), Load()), Name('b', Load())],
[],
None,
None
),
Name('S', Load())
],
Load()
),
Index(
Compare(
Call(Name('len', Load()), [Name('S', Load())], [], None, None),
[Eq()],
[Name('b', Load())]
)
),
Load()
)
)
)]
)
如您所见,此代码在调用 lambda 时执行的第一件事是创建元组,然后直接对Call(Name('g'...
同一个 lambda 进行递归调用 ()。
调用是完成的第一件事,因为空列表的切片仍然是空列表:
>>>[1][1:]
[]
>>>[][1:]
[]
这意味着g(S[1:])
将减少您的列表直到空列表,然后继续无休止地g
使用空列表调用。发生这种情况是因为解析器执行语句的方式。执行的第一件事是递归方法调用,因此它不会停止。
我的观点:基本情况不适用于递归。
希望这能为主题带来更多亮点。