其实你可以!这个带有解释的例子有望说明如何。
定义递归示例以仅在数字为 5 或更大时获取数字,如果不是,则将其递增并再次调用“检查”函数。重复此过程,直到达到 5,此时返回 5。
print [ (lambda f,v: v >= 5 and v or f(f,v+1))(lambda g,i: i >= 5 and i or g(g,i+1),i) for i in [1,2,3,4,5,6] ]
结果:
[5, 5, 5, 5, 5, 6]
>>>
基本上这两个匿名函数以这种方式交互:
let f(g,x) = {
expression, terminal condition
g(g,x), non-terminal condition
}
let g(f,x) = {
expression, terminal condition
f(f,x), non-terminal condition
}
使 g,f 成为'same'函数,只是在其中一个或两个中添加一个修改参数的子句,以便达到终止条件然后执行
f(g,x) 以这种方式 g 成为 f 的副本,使其如下:
f(g,x) = {
expression, terminal condition
{
expression, terminal condition,
g(g,x), non-terminal codition
}, non-terminal condition
}
您需要这样做,因为您无法在执行时访问匿名函数本身。
即
(lambda f,v: somehow call the function again inside itself )(_,_)
所以在这个例子中,让 A = 第一个函数, B = 第二个。我们将传递 B 的 A 称为 f,将 i 称为 v。现在 B 本质上是 A 的副本,它是一个已传递的参数,您现在可以调用 B,就像调用 A。
这会在列表中生成阶乘
print [ (lambda f,v: v == 0 and 1 or v*f(f,v-1))(lambda g,i: i == 0 and 1 or i*g(g,i-1),i) for i in [1,2,3,5,6,7] ]
[1, 2, 6, 120, 720, 5040]
>>>