SICP 习题 (1.21) 解题总结

SICP 习题1.21要求用书中的smallest-divisor过程找出199, 1999, 19999的最小因子。

这道题是个纯复习题,没有新知识,也没有什么难度。


为了方便,将书中的smallest-divisor过程列出如下:


(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))

(define (square x)
  (* x x))

使用这个过程计算一下下面的代码就可以得出题目要求的结果了。

(smallest-divisor 199)
(smallest-divisor 1999)
(smallest-divisor 19999)

如果希望仔细看过程smallest-divisor的原理也很简单,书中说的也比较清楚,大概思路就是从2开始检查,看是不是目标数n的因子,是就返回,不是就将当前检查过的数加一继续检查。


这个方法是个笨办法,逐个逐个去算,其中有一点点小聪明的是不需要检查到目标数n,只需要检查到 "根号n",因为两个"根号n"相乘已经大于n了,比根号n大的数不会是n的最小因子。


以上就是习题1.21的解题过程,虽然题目很简单,建议大家还是在你的Scheme环境里自己实现一遍smallest-divisor过程,这样理解的更透彻一点,也为以后几道题打好基础,因为后面开始讨论素数检测的时候经常要用到这里的几个过程。


你可能感兴趣的:(SICP 习题 (1.21) 解题总结)