我不明白foo()函数如何处理这2个lambda,这3个函数由togheter执行阶乘计算。
def foo(f):
return (lambda x: x(x))(lambda x: f(lambda *args: x(x)(*args)))
def bar(f):
return lambda n: (1 if n < 2 else n * f(n - 1))
def baz(n):
return foo(bar)(n)
print(baz(7))
输出:
5040
从baz()函数开始。我从未见过在同一return语句中使用两个参数但使用双括号的语法,我正在尝试研究一个示例,但现在不知道如何开始。有人可以帮我理解这里的逻辑吗?
我发现这样做:
print(foo(bar)(7))
还将返回5040
所以,语法中的双括号是这样的吗?
function_1(function_2)(argument))
我不知道这是调用函数的有效方法
让我们从语法开始。此调用foo(bar)
返回一个函数。然后使用参数7
:foo(bar)(7)
调用它。您可以将print(foo(bar)(7))
改写为
f = foo(bar)
print(f(7))
代码本身是一个难题。实际上,这类难题最好由代码本身来解释。如果有人用简单的英语写出整个逻辑,那么没人会理解。尽管可以解释基本概念。函数bar
获取一个函数作为参数并返回一个函数。显然,参数和返回的函数都应该等效。它来自阶乘递归定义。因此,foo
是调用此函数结果的理想方法。如果您真的想了解它是如何工作的,建议您将lambda重写为普通函数。