SICP第一章:构造过程抽象(1.3)

1.3 用高阶函数做抽象

1.3.1 过程作为参数

1.高阶过程

以过程作为参数,或者以过程作为返回值,这类能操作过程的过程称之为高阶过程

2.应用于积分

模式一:

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))

计算:其中,f = x³ ,a=0;b=1
在这里插入图片描述

(define (integral1 f a b dx)
  (define (add-dx x) (+ x dx))
  (* (sum f (+ a (/ dx 2.0)) add-dx b)
     dx))

(define (cube x) (* x x x))

(integral1 cube 0 1 0.01)

>0.24998750000000042   ;;cube在01间积分的精确值是1/4

此方法计算积分并不准确,是一个近似值。练习1.29会给出一个更精确的求积分的方法:辛普森规则

这种函数不能应用于其他语言,1.3.2节说明如和摆脱这种定义

1.3.2 用lambda构造过程

1. 一般形式

(lambda (<formal-parameters>) <body>)

<formal-parameters>为形式参数;<body>为过程体
lambda用于define同样的方式创建过程,此过程不与环境中任何名字相关联。

按如下方式阅读lambda表达式:

(lambda   (x)   (   +     x   4))
该过程  以x为参数  它加起    x 和 4 

2.lambda的应用

1.不需要定义辅助过程
(define (pi-sum a b)
	(sum (lambda (x) (/ 1.0 (* x (+ x 2))))   ;;sum的定义是上面的模式一
			a
			(lambda (x) (+ x 4))
			b))
2.可用作组合式的运算符
((lambda (x y z) (+ x y (* z z))) 1 2 3)

3.用let创建局部变量

1. 一般形式
(let ((<var1> <exp1>)
	  (<var2> <exp2>)
		       :
	  (<varn> <expn>))
	<body>)

可以将它读作

<var1> 具有值 <exp1> 而且
   <var2> 具有值 <exp2> 而且
   :
   <varn> 具有值 <expn> 
	:
在 <body>
2.let表达式被解释为替代如下表达式的另一种语法形式

(对比 lambda可用作组合式的运算符 容易懂)

((lambda (<var1> ...<varn>)
	  <body>)
	<exp1>
	:
	<expn>)

let表达式只是作为基础的lambda表达式的语法外衣罢了

1. 用于与注意

1).let使人能在尽可能接近其使用的地方创建局部变量约束:

(define (test x)
  (+ x (let ((x 6)) (- x 2))))
  
(test 6)
>10

2).变量的值是在let之外计算的

(define (test x)
 (let ((x 3)
       (y (+ x 2)))
   (* x y)))
   
(test 2)
>12

1.3.3 过程作为一般性方法

目的: 如何通过过程去直接描述这些方法

1.通过区间折半寻找方程的根
(define (average x y) (/ (+ x y) 2))  ;求两个数平均值

(define (close-enough? x y) ;;两数之差的绝对值是否足够接近0.001
  (< (abs (- x y)) 0.001))

#|检测过程|#
(define (search f neg-point pos-point)
  (let ((midpoint (average neg-point pos-point)))
    (if (close-enough? neg-point pos-point)
        midpoint
        (let ((te
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值