庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

scip 第一章最后7题的解答

Posted on 2007-05-18 15:58 dennis 阅读(752) 评论(0)  编辑  收藏 所属分类: 计算机科学与基础
    第一章两天前就读完了,因为工作上的事情拖到现在才来做最后这七道题,这些题目都是要求写一个过程返回另一个过程作为结果。

习题1.40,显而易见,要求cubic过程返回的就是方程本身,照着定义来就行了:
(define (cubic a b c)
  (lambda(x) (
+ (* x x x) (* a x x) (* b x) c)))

习题1.41,注意到了题目已经说明了:以有一个参数的过程做参数,那就很简单了:
(define (double g) (lambda(x) (g (g x))))

返回lambda构造的过程,参数过程应用两次即可,那么
> (((double (double double)) inc) 5)
21

习题1.42,组合应用:
(define (composite f g)
  (lambda(x) (f (g x))))

习题1.43,在1.42基础上使用递归即可:
(define (repeated f n)
  (
if (= n 1)
      f
      (composite f (repeated f (
- n 1)))))

习题1.44,在1.43基础上,首先定义smooth过程:
(define (smooth f)
  (lambda(x) (
/ (+ (f (- x dx)) (f x) (f (+ x dx))) 3)))

然后使用repeated过程产生n次平滑函数:
(define (repeate-smooth n)
  (repeated smooth n))

习题1.45,不是一下子能说清楚,经过测试可以知道n次方根搜索不动点,平均阻尼需要经过log2(n)(以2为底的对数)重复才会收敛,因此:
(define (nth-root-test x n k)
  (fixed
-point ((repeated average-damp k) (lambda (y) (/ x (fast-expt y (- n 1)))))
               
1.0))

习题1.46,这题很有趣,产生过程的过程也是递归的,相当好玩,iterative-improve产生的过程需要递归调用自身,仍然使用iterative-improve产生:
(define (iterative-improve good-enough improve-it)
  (lambda(guess) 
    (
if (good-enough guess)
        guess
        ((iterative
-improve good-enough improve-it) (improve-it guess)))))
如果猜测结果足够,返回猜测结果,如果没有,递归调用lambda产生的这个过程应用于改进后的猜测值。
重写sqrt如下:

(define (sqrtt x)
  (define (good
-enough? guess)
      (
< (abs (- (square guess) x)) 0.0001))
  (define (improve guess)
    (average guess (
/ x guess)))
  (iterative
-improve good-enough? improve))
注意,这里的sqrrt过程产生的是一个以初始猜测值为参数的过程,所有调用应该这样:
> ((sqrtt 41.0)
2.000000000929222947

下面的fixed-point过程也是如此。


重写fixed-point过程如下:
(define (fixed-point f)
  (define tolerance 
0.00001)
  (define (good
-enough? guess)
    (
< (abs (- guess (f guess))) tolerance))
  (define (improve guess) (f guess))
  (iterative
-improve good-enough? improve))





只有注册用户登录后才能发表评论。


网站导航: