【发布时间】:2013-11-20 12:12:06
【问题描述】:
在 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]。
但是,令我惊讶的是,以下使用“三元破解”[a,b][c] 而不是“b if c else a”(又名“c?b:a”)的解决方案不起作用:
g = lambda S,b : (g(S[1:],b),S)[len(S)==b]
这将超过最大递归深度。
为什么这不起作用?
(我知道这两者都不是优秀的编码风格的例子,但现在这无关紧要。)
【问题讨论】:
-
在第二种情况下,计算元组的两个元素,然后选择其中一个。这意味着递归调用总是发生!
-
请注意,该函数在
len(S) < b的情况下缺乏保护措施,即它会递归地从列表中删除,即使它为空,也会导致对g的无限递归调用。 -
+1 三元 hack 对我来说是新的 :)
-
我刚刚了解到以下代码确实有效的有趣事实:
g = lambda S,b : (lambda : g(S[1:],b), lambda : S)[len(S)==b]()
标签: python recursion conditional-operator