以下程序找到给定数字n的最小积分除数(大于1)。它以一种直接的方式来完成此操作,通过测试n的连续整数以2。
开始的分解性来做到这一点。(define (smallest-divisor n)
(find-divisor n 2))
(define (find-divisor n test-divisor)
(cond ((> (square test-divisor) n) n)
((divides? test-divisor n) test-divisor)
(else (find-divisor n (+ test-divisor 1)))))
(define (divides? a b)
(= (remainder b a) 0))
我们可以测试一个数字是否为素数如下:n是当时且仅当n是其自己的最小除数时。
(define (prime? n)
(= n (smallest-divisor n)))
Find-Divisor的最终测试是基于以下事实:如果N不是Prime,则必须具有小于或等于N.44的除数,这意味着该算法仅需要1和n之间的测试除数。因此,将n识别为Prime所需的步骤数将具有增长顺序(n)。
您的最后一段被复制了一些错误。它是 sqrt(n),不是 n ,从阅读代码中很明显。
要理解此代码,您需要阅读它,慢慢。本书的作者以这种详细的方式编写了他们的代码,以便可以在阅读时以缓慢,英语和理解。据我了解,这是他们的目标。
喜欢:
(define (smallest-divisor n)
(find-divisor n 2))
我们将数字 n 的最小除数定义为找到 n 的除数的结果,其起始值为 2 。因此,我们不会将 1 视为数字的除数。到目前为止还不错。
(define (find-divisor n test-divisor)
查找具有 test Divisor 的数字 n 的除数;既然是一个论点,那么该代码准备与给出的任何值一起工作...这些价值是什么?现在我们知道 2 是一种可能性;让我们保持这种思想并重新恢复稍后检查):
(cond ((> (square test-divisor) n) n)
首先将测试除数的平方与 n 进行比较,以防正方形大于 n ,返回<结果为em> n 结果为em>。我们找到了!
((divides? test-divisor n) test-divisor)
如果先前的测试不成功,我们下一个尝试测试 testdivisor divides n 。如果这样做,我们将 test Divisor 作为结果返回。我们找到了!
(else (find-divisor n (+ test-divisor 1)))))
如果所有先前的测试都失败了,我们会进入此问题的关键:
- 找到一个数字 n 的除数,其值 testdivisor 没有平移与找到一个divisor n 的启动值此测试分隔值 plus 1 !
这只是用简单的英语说:"让我们尝试将 n 与下一个测试编号分开。
(....那么,除了 2 ?)测试divisor 可以有什么值?)?)
(define (divides? a b)
(= (remainder b a) 0))
您现在可以完成吗?