Posted on 2007-05-18 15:58
dennis 阅读(760)
评论(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 4) 1.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))