SICP 习题 (1.21) 解题总结
2013-12-25 23:07
267 查看
SICP 习题1.21要求用书中的smallest-divisor过程找出199, 1999, 19999的最小因子。 这道题是个纯复习题,没有新知识,也没有什么难度。
为了方便,将书中的smallest-divisor过程列出如下:
使用这个过程计算一下下面的代码就可以得出题目要求的结果了。
如果希望仔细看过程smallest-divisor的原理也很简单,书中说的也比较清楚,大概思路就是从2开始检查,看是不是目标数n的因子,是就返回,不是就将当前检查过的数加一继续检查。
这个方法是个笨办法,逐个逐个去算,其中有一点点小聪明的是不需要检查到目标数n,只需要检查到 "根号n",因为两个"根号n"相乘已经大于n了,比根号n大的数不会是n的最小因子。
以上就是习题1.21的解题过程,虽然题目很简单,建议大家还是在你的Scheme环境里自己实现一遍smallest-divisor过程,这样理解的更透彻一点,也为以后几道题打好基础,因为后面开始讨论素数检测的时候经常要用到这里的几个过程。
为了方便,将书中的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.43)解题总结
- SICP 习题 (1.10)解题总结:阿克曼函数
- SICP 习题(1.1,1.2,1.3,1.4)解题总结,起步。
- SICP 习题 (2.29) 解题总结:二叉活动体
- SICP 习题 (1.40)解题总结
- SICP 习题 (2.12)解题总结 :区间的不同实现方式
- SICP 习题 (2.8) 解题总结:区间的减法
- SICP 习题 (2.20)解题总结: 不确定数量参数
- SICP习题 (1.12)解题总结
- SICP 习题 (2.30)解题总结 : Square-Tree
- SICP 习题 (1.41)解题总结
- SICP 习题 (2.10)解题总结: 区间除法中除于零的问题
- SICP 习题 (1.44)解题总结
- SICP 习题 (2.21)解题总结: map的使用
- SICP 习题 (2.24)解题总结:列表的结构
- SICP 习题 (2.6) 解题总结:丘奇计数
- SICP 习题(1.5)解题总结:应用序和正则序
- SICP 习题 (2.31)解题总结 : 通用的Square-Tree
- SICP 习题 (1.13) 解题总结
- SICP 习题 (1.19) 解题总结