码迷,mamicode.com
首页 > 其他好文 > 详细

SICP 1-33 1-34 1-35

时间:2016-05-12 22:00:23      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

ex1-32 要求利用过程返回值给出一个用于计算 f(f (x))这样的函数过程

ex1-33要求计算一个函数的平滑函数g(x)=(f(x-dx)+f(x)+f(x+dx))/3

并利用ex1-32给出的过程进行多次的平滑运算以下,给出代码

(define (smooth f)
        (lambda (x)
                (/ (+ (f (- x .001)) (f x) (f (+ x .001))) 3)))
(define (repeated f x)
        (lambda (times)
                (if (= times 0) x
                        ((repeated f (f x)) (- times 1)))))
(define (n-folds f x times)
        ((repeated (smooth f) x)times))

技术分享

ex1-34要求利用newton求根方式 给出(newton (cubic a b c) 1) 来计算x^3+a*x^2+b*x+c的根

以下是代码

(define (f x) (- (* x x x) 3))
(define (deriv f dx)
        (lambda (x) (/ (- (f (+ x dx)) (f x)) dx)))
(define (Newton f guess)
        (let
                ((fx (f guess)))
                (let
                        ((new (- guess (/ fx ((deriv f .001) guess)))))
                        (if     (< (abs fx) .001)
                                guess
                                (Newton f new)))))
(define (cubic a b c)
        (lambda (x)
                (+ (* x x x) (* a (* x x)) (* b x) c)))


技术分享

ex1-35 要求利用high-order process的形式进行抽象

将newton 以及之前的fixed-point进行 抽象化

(iterative test improve x) 以下给出代码

(define (iterative test improve x)
	(if (test x) x (iterative test improve (improve x))))
(define (newton f x) 
	(iterative
		(lambda (x) (< (abs (f x)) .001))
		(lambda (x) (- x (/ (f x) (/ (- (f (+ x .001)) (f x)) .001))))
		x))
(define (fixed-point f x)
	(iterative
		(lambda (x) (< (abs (- (f x) x)) .001))
		f
		x))

技术分享

技术分享

顺便热烈庆祝一下完成了第一单元的任务(才发现1985版的和中文译本那个2nd习题都不一样,难怪我都找不到答案)

SICP 1-33 1-34 1-35

标签:

原文地址:http://blog.csdn.net/zb1030415419/article/details/51355071

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!