gpt4 book ai didi

python - 在 Python 中使用三元运算符 'hack' 进行递归

转载 作者:太空狗 更新时间:2023-10-29 20:15:49 25 4
gpt4 key购买 nike

在 Python 中玩转,我发现下面的代码可以正常工作:

f = lambda S,b : (S if len(S)==b else f(S[1:],b))

从列表 S 中,它将递归地删除第一个元素,直到 S 的长度等于 b。例如 f([1,2,3,4,5,6],3) = [4,5,6]。

然而,令我惊讶的是,以下解决方案使用“三元 hack”[a,b][c] 而不是“b if c else a”(又名“c?b:a”)不起作用:

g = lambda S,b : (g(S[1:],b),S)[len(S)==b]

这将超过最大递归深度。

为什么这行不通?

(我知道这两者都不是优秀编码风格的例子,但现在已经离题了。)

最佳答案

好的,让我们看看 lambda 函数生成的 ast:

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。发生这种情况是因为解析器执行语句的方式。首先执行的是递归方法调用,所以它不会停止。

我的观点:基本情况不适用于递归。

希望这能给主题带来更多启发。

关于python - 在 Python 中使用三元运算符 'hack' 进行递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19859827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com