SICP帮助我理解这一点



以下程序找到给定数字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)
  1. 首先将测试除数的平方与 n 进行比较,以防正方形大于 n ,返回<结果为em> n 。我们找到了!

        ((divides? test-divisor n) test-divisor)
    
  2. 如果先前的测试不成功,我们下一个尝试测试 testdivisor divides n 。如果这样做,我们将 test Divisor 作为结果返回。我们找到了!

        (else (find-divisor n (+ test-divisor 1)))))
    
  3. 如果所有先前的测试都失败了,我们会进入此问题的关键:

    • 找到一个数字 n 的除数,其值 testdivisor 没有平移找到一个divisor n 的启动值此测试分隔值 plus 1


    这只是用简单的英语说:"让我们尝试将 n 与下一个测试编号分开。

(....那么,除了 2 ?)测试divisor 可以有什么值?)?)

(define (divides? a b)
  (= (remainder b a) 0))

您现在可以完成吗?

相关内容

最新更新