SICP 1-33 1-34 1-35

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习题都不一样,难怪我都找不到答案)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值