问题描述如下: 实现 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函数的本质在哪里,我对此感到困惑。
嗨,我正在研究这个问题,我失败了并查看了解决方案,我花了很长时间才理解...... 例如 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