任何人都可以帮助理解递归lambda表达式和函数调用中的double()()语法吗?

问题描述 投票:0回答:2

我不明白foo()函数如何处理这2个lambda,这3个函数由togheter执行阶乘计算。

5/10/2020 更新:我修改了代码,以使用每个函数中的全局变量和计数器更好地了解这些lambda如何工作。

"""7. What math operation does the following perform?"""

foo_counter = 0
bar_counter = 0
baz_counter = 0


def foo(f):
    global foo_counter
    foo_counter += 1
    print("foo = %d" % foo_counter)
    return (lambda x: x(x))(lambda x: f(lambda *args: x(x)(*args)))


def bar(f):
    global bar_counter
    bar_counter += 1
    print("bar = %d" % bar_counter)
    return lambda n: (1 if n < 2 else n * f(n - 1))


def baz(n):
    global baz_counter
    baz_counter += 1
    print("baz = %d" % baz_counter)
    return foo(bar)(n)

print(baz(7))

输出:

baz = 1
foo = 1
bar = 1
bar = 2
bar = 3
bar = 4
bar = 5
bar = 6
bar = 7
5040

Process finished with exit code 0

[因此,基本上baz()使用怪异的double()()表示法bar()调用foo(bar)(n),然后正如@所说,foo()使用2个lambda将值传递给bar()并定义了函数f(lambda *args: x(x)(*args))) ]内部,最后调用bar(),这是执行阶乘的函数。但是,即使我不理解其背后的逻辑,也希望有人能帮助我们理解。

function recursion lambda python-3.7 factorial
2个回答
1
投票

让我们从语法开始。此调用foo(bar)返回一个函数。然后使用参数7foo(bar)(7)调用它。您可以将print(foo(bar)(7))改写为


0
投票

我发现这样做:

© www.soinside.com 2019 - 2024. All rights reserved.