SICP 习题 (1.21) 解题总结

88 篇文章 30 订阅
74 篇文章 0 订阅

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过程,这样理解的更透彻一点,也为以后几道题打好基础,因为后面开始讨论素数检测的时候经常要用到这里的几个过程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值