CS61A-lab03_Q5
本文最后更新于:2023年10月31日 晚上
Q5: It’s Always a Good Prime
Implement
div_by_primes_under
, which takes in an integern
and returns an n-divisibility checker. An n-divisibility-checker is a function that takes in an integer k and returns whetherk
is divisible by any integers between 2 andn
, inclusive. Equivalently, it returns whetherk
is divisible by any primes less than or equal ton
.Review the Disc 01
is_prime
problem for a reminder about prime numbers.You can also choose to do the no lambda version, which is the same problem, just with defining functions with def instead of lambda.
Solution:
1 |
|
Analysis:
核心理论依据:如果一个数不能整除以比它小的任何素数,那么这个数就是素数。[1]
要求checker
函数实现的功能就是判断k
是否能整除以任何一个从2
到n
的素数,当然也就能同时实现判断一个数是否是素数。
根据一般想法,我们可以在div_by_primes_under_no_lambda
函数里面定义一个normal_checker
函数,使它对i
从2
到n
逐个进行判断:满足i
是素数且x % i == 0
即可。示例如下:[2]
1 |
|
理解此种一般做法之后,再来对官网给出的答案进行分析:
1 |
|
i
的初始值为2,是素数,此时check(2)
的值为False
,直接进入while
循环,if
条件满足,定义嵌套函数outer
和inner
,接着checker
函数被更新为outer(checker, i)
的返回值,即return x % 2 == 0 or False
,现在checker
函数就能判断一个数是否能整除2
。
i
更新为3
后,进入下一次循环,此时if
语句中的checker
函数返回值依旧是return x % 2 == 0 or False
,刚好能判断3能否整除以任何一个比他小的任何素数(也就是2),判断出3是素数。if
条件满足,更新checker
函数,使之能判断x
是否能整除以素数3
。注意,此时的checker
函数返回值为return x % 3 == 0 or f(x)
,这里的f(x)
是i=2
时的checker
函数,也就等价于return x % 3 == 0 or False
,也就是说,此时checker
的返回语句等价于return x % 3 == 0 or x % 2 == 0 or False
。
以此类推:i=4
不是素数,不需要更新checker
函数直接进入下次循环,i=5
是素数,更新checker
函数直到i=n
,此时checker
函数也更新为能够判断能否整除以2 ~ n
的任何素数,即return x % k == 0 or...or...or...False
(k是某个整数),是以or
连接的一串整除判断语句,每一个f(x)
都继承了上一轮循环的checker
函数的返回值。
同理,简写的lambda
表达式版函数也可以理解了。