我正在尝试找出数字的最小非约数(https://codegolf.stackexchange.com/questions/105412/find-the-smallest-number-that-doesnt-divide-n)。以下使用“命名 let”版本可以正常工作:
(define (f1 m)
(let loop ((n 2))
(cond
[(= 0 (modulo m n))
(loop (+ 1 n))]
[else n])))
我正在进行测试:
(f 24)
(f 1234567)
(f 12252240)
(f 232792560)
以上版本输出:5 2 19 和 23。
然而,下面这个使用内置的 for
循环的版本非常慢,并且在处理更大的数字时会崩溃并出现内存不足的错误:
(define (f2 m)
(for/first ((i (range 2 m))
#:when (not (= 0 (modulo m i)))
#:final (not (= 0 (modulo m i))))
i))
第二个版本的代码是否存在错误,或者与Racket中的命名let相比,for循环效率较低?
range
替换为in-range
。 - Alexis Kingrange
生成一个列表,in-range
生成一个序列(并且还与for
协作以提高迭代性能)。也许range
也可以进行调整,以便与for
协作。 - Alexis King