这里的检查器功能是如何实现和更新的? (来自 CS61a UCB)

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

问题描述如下: 实现 div_by_primes_under,它接受整数 n 并返回 n 整除性检查器。 n 整除性检查器是一个函数,它接受整数 k 并返回 k 是否可以被 2 到 n 之间的任何整数整除(包括 2 和 n)。等价地,它返回 k 是否可以被任何小于或等于 n 的素数整除。

[cs61a](https://cs61a.org/lab/sol-lab03/

解决方案是:

def div_by_primes_under(n):
    """
    >>> div_by_primes_under(10)(11)
    False
    >>> div_by_primes_under(10)(121)
    False
    >>> div_by_primes_under(10)(12)
    True
    >>> div_by_primes_under(5)(1)
    False
    """
    checker = lambda x: False
    i = 2
    while i <= n:
        if not checker(i):
            checker = (lambda f, i: lambda x: x % i == 0 or f(x))(checker, i)
        i = i + 1
    return checker

自从“i%i == 0”以来,

checker
总是返回True吗,检查器函数是如何工作的,这个lambda函数的本质在哪里,我对此感到困惑。

python function sicp
1个回答
0
投票

嗨,我正在研究这个问题,我失败了并查看了解决方案,我花了很长时间才理解...... 例如 div_by_primes_under(5)(6)

我们想看看 6 是否可以被 2 到 5(含)之间的任何质数整除 2 到 5 之间,质数为 2, 3, 5 所以最后,检查器函数将是 lambda x: x%5 == 0 或 (x%3 == 0 或 (x%2 == 0)) 然后这个函数将应用于 x=6,我们将得到 true,因为 6%3 == 0 是 True

checker = (lambda f, i: lambda x: x % i == 0 or f(x))(checker, i) 允许我们更新检查器函数,因此我们只在素数上测试 x

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