1
def summation(calc_termo, linf, prox, lsup):
    soma = 0
    while linf <= lsup:
        soma = soma + calc_termo(linf)
        linf = prox(linf)
    return soma
summation(lambda x: summation(lambda x: x, 1, lambda x: x + 1, x),1, lambda x: x + 1, 5)

我很难理解这段代码是如何工作的。我从我的大学得到了这个作为练习,我在理解代码时遇到了一些麻烦。

它似乎是 1 到 5 之间数字的总和,但无法理解是什么summation(lambda x: x, 1, lambda x: x + 1, x)

4

2 回答 2

3

我首先将这些论点分开:

lambda x: summation(lambda x: x, 1, lambda x: x + 1, x)

将这些变量替换回原始函数并简化它:

def inner_function(x):
    soma = 0
    linf = 1

    while linf <= x:
        soma += linf + 1
        linf += 1

    return soma

再简化一点:

def inner_function(x):
    soma = 0

    for linf in range(1, x + 1):
        soma += linf

    return soma

还有一点:

inner_function = lambda x: sum(range(1, x + 1))

还有更多:

inner_function = lambda x: x * (x + 1) / 2

现在您的原始功能变为:

def summation(calc_termo, linf, prox, lsup):
    soma = 0

    while linf <= lsup:
        soma = soma + calc_termo(linf)
        linf = prox(linf)

    return soma

summation(inner_function, 1, lambda x: x + 1, 5)

或者:

def summation(linf, prox, lsup):
    soma = 0

    while linf <= lsup:
        soma = soma + linf * (linf + 1) / 2
        linf = prox(linf)

    return soma

summation(1, lambda x: x + 1, 5)

你可以从那里拿走它。我有:

summation = lambda: sum(n * (n + 1) / 2 for n in range(6))

这等于:

sum(sum(range(n + 1)) for n in range(6))
于 2013-01-11T22:47:49.703 回答
0

您遇到问题的最后一行可以更好地表述为:

summation(lambda x: summation(lambda y: y, 1, lambda z: z + 1, x),1, lambda w: w + 1, 5)

如果您对此感到困惑,那么 lambda 并不都会相互干扰。

于 2013-01-11T22:51:26.657 回答