Scheme语言控制抽象 全_第1页
Scheme语言控制抽象 全_第2页
Scheme语言控制抽象 全_第3页
Scheme语言控制抽象 全_第4页
Scheme语言控制抽象 全_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

函数式程序设计语言Scheme语言控制抽象第二部分第二章Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象参考教材计算机程序的构造和解释(原书第2版)StructureandInterpretationofComputerPrograms,SecondEditionMassachusettsInstituteofTechnology

(美)HaroldAbelson,GeraldJaySussman,JulieSussmanScheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象引言

任何强有力的程序设计语言都必须能表述基本的数据和过程,还需要提供对数据和过程进行组合和抽象的方法。——摘自《计算机程序的构造和解释》Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象程序设计基本元素1表达式⑴元表达式常量

数486字符串,例如:“hello”布尔值,例如:#f,#t名字例如:+//内部过程例如:pi//由define或其他过程创建的变量⑵组合表达式(前缀表示法)组合:(<operator><operand><operand>…)(+2135127)(+(*3(+(*24)(+35)))(+(-107)6))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象2命名命名(definepai3.14159)(defineradius10)(*pai(*radiusradius))(definecircumference(*2pairadius))circumferenceScheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象3复合过程过程定义的一般形式:

过程定义在环境中关联符号name例如:

(define

(<name>

<formal

parameters>)

<body>)(define

(square

x)

(*

x

x))(square

21)

441

(square

(+

2

5))

49

(square

(square

3))

81Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象3复合过程定义过程x2+y2

将sum-of-squares作为构件,进一步构造其它过程:(define

(f

a)

(sum-of-squares

(+

a

1)

(*

a

2)))

(f

5)

136(define

(sum-of-squares

x

y)

(+

(square

x)

(square

y)))(sum-of-squares

3

4)

25Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象

4求值模型①应用序求值(代换模型)先求值参数,后应用的求值模型(Scheme采用该模型)②正则序求值先完全展开,后归约的求值模型(f5)(sum-of-squares(+a1)(*a2))(sum-of-squares(+51)(*52))(+(square6)(square10))(+(*66)(*1010))(+36100)136(f5)(sum-of-squares(+a1)(*a2))(sum-of-squares(+51)(*52))(+(square(+51))(square(*52)))(+(*(+51)(+51))(*(*52)(*52)))(+(*66)(*1010))(+36100)136Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象5条件表达式和谓词条件表达式语法形式:例如:求

(define(absx)(cond((>x0)x)((=x0)0)((<x0)(-x))))(cond

(<p1>

<e1>)

(<p2>

<e2>)

(<pn>

<en>)(else<e>))(define(absx)(cond((<x0)(-x))(elsex)))(define(absx)(if(<x0)(-x)x))(if

<predicate>

<consequent>

<alternative>)Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象5条件表达式和谓词其它复合谓词(and<e1>...<en>)(or<e1>...<en>)

(not<e>)例如:检测某个数是否大于或等于另一个数

(define

(>=

x

y)

(or

(>

x

y)

(=

x

y)))(define

(>=

x

y)

(not

(<

x

y)))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象实例:采用牛顿法求平方根平方根函数——牛顿逐步逼近法求猜测商平均值(更好的猜测)1(2/1)=2(2+1)/2=1.51.5(2/1.5)=1.3333(1.3333+1.5)/2=1.41671.4167(2/1.4167)=1.4118(1.4167+1.4118)/2=1.41421.4142…………Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象实例:采用牛顿法求平方根(define

(sqrt

x)

(sqrt-iter

1.0

x))(define

(sqrt-iter

guess

x)

(if

(good-enough?

guess

x)

guess

(sqrt-iter

(improve

guess

x)

x)))(define

(good-enough?

guess

x)

(<

(abs

(-

(square

guess)

x))

0.001))(define

(improve

guess

x)

(average

guess

(/

x

guess)))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象实例:采用牛顿法求平方根sqrtsqrt-itergood-enough?improveaveragesquareabs求解复杂问题的一种方法归约原理:复杂问题分解为子问题Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象6内部定义和块结构块结构:允许嵌套定义Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象6内部定义和块结构块结构:词法作用域Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象素数检测从2开始的连续整数去检查能否整除n(define

(smallest-divisorn)

(find-divisor

n2))(define

(find-divisorntest-divisor)

(

cond((>(squaretest-divisor)

n)

n)

((divides?test-divisorn)

test-divisor)

(else

(find-divisorn

(+test-divisor1)))))(define

(divides?ab)

(=(remainderba)0))(define

(prime?n)

(=n(smallest-divisorn)))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象过程计算1线性的递归和迭代线性的递归过程例如:(define

(factorial

n)

(if

(=

n

1)

1

(*

n

(factorial

(-

n

1)))))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象考察6!(factorial6)(*6(factorial5))(*6(*5(factorial4)))(*6(*5(*4(factorial3))))(*6(*5(*4(*3(factorial2)))))(*6(*5(*4(*3(*2(factorial1))))))(*6(*5(*4(*3(*21)))))(*6(*5(*4(*32))))(*6(*5(*46)))(*6(*524))(*6120)720Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象线性迭代过程product

counterproductcounter

counter+1*(define

(factorial

n)

(fact-iter

1

1

n))

(define

(fact-iter

product

counter

max-count)

(if

(>

counter

max-count)

product

(fact-iter

(*

counter

product)(+

counter

1)

max-count)))

Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象考察6!Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象线性的递归和迭代两种计算过程的分析比较:①线性的递归计算过程代换模型揭示出一种先展开后收缩的形状。解释器需要维护以后将要执行的操作的轨迹。对应的计算称为递归计算过程。②线性迭代计算过程状态可以用固定数目的状态变量描述。解释器只需要保存有限的状态变量的轨迹。对应的计算称为迭代计算过程。③注意:递归过程和递归计算过程是两个不同的概念。递归过程的计算也可能是迭代的计算过程。Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象练习1求幂(define(expt1bn)(if(=n0)1(*b(expt1b(-n1)))))(define(expt2bn)(expt-iterbn1))(define(expt-iterbcounterproduct)(if(=counter0)product(expt-iterb(-counter1)(*bproduct))))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象练习快速求幂(define(fast-exptbn)(cond((=n0)1)((even?n)(square(fast-exptb(/n2))))(else(*b(fast-exptb(-n1))))))(define(even?n)(=(remaindern2)0))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象过程计算2树形递归【例】Fibonacci数列

Fib(n)=01Fib(n-1)+Fib(n-2)ifn=0ifn=1其它(define

(fib

n)

(cond

((=

n

0)

0)

((=

n

1)

1)

(else

(+

(fib

(-

n

1))(fib

(-

n

2))))))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象树形递归Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象树形递归改进:使用迭代计算过程。规则:(define

(fib

n)

(fib-iter

1

0

n))

(define

(fib-iter

a

b

count)

(if

(=

count

0)

b

(fib-iter

(+

a

b)

a

(-

count

1))))a

a+bb

a<??><??><??><??>Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象练习1线性递归线性迭代两种方法求解函数f<??>Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象练习1线性递归线性迭代两种方法求解函数f<??><??><??><??>Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象用高阶函数做抽象回顾:过程抽象机制为公共的模式命名,建立抽象。

问题:能否将同样的程序设计模式用于不同的过程?

以过程作为参数,或者以过程作为返回值。高阶过程能够操作过程的过程,称为高阶过程。(define

(cube

x)

(*

x

x

x))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象过程1:计算给定范围内的各整数之和。过程2:计算给定范围内的整数的立方和。过程3:序列求和(define

(sum-integers

a

b)

(if

(>

a

b)

0

(+

a

(sum-integers

(+

a

1)

b))))(define

(sum-cubes

a

b)

(if

(>

a

b)

0

(+

(cube

a)

(sum-cubes

(+

a

1)

b))))(define

(pi-sum

a

b)

(if

(>

a

b)

0

(+

(/

1.0

(*

a

(+

a

2)))

(pi-sum

(+

a

4)

b))))(define

(<name>

a

b)

(if

(>

a

b)

0

(+

(<term>

a)

(<name>

(<next>

a)

b))))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象高阶过程-过程作为参数公共模式(更高级别的抽象)

高阶过程sum注:term和next为过程参数。(define

(sum

term

a

next

b)

(if

(>

a

b)

0

(+

(term

a)

(sum

term

(next

a)

next

b))))<??>Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象过程1:计算给定范围内的各整数之和。过程2:计算给定范围内的整数的立方和。(define

(sum-integers

a

b)

(sumidentityainc

b))(define

(sum-cubes

a

b)

(sum

cube

a

inc

b))(define

(inc

n)(+n1))(define

(identityx)x)(define

(cube

x)

(*

x

x

x))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象过程3:序列求和(define

(pi-term

x)

(

/

1.0

(*

a

(+

a

2))))(define

(pi-sum

a

b)

(sum

pi-term

a

pi-next

b))(define

(pi-next

x)

((+

a

4))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象练习1用sum构造f的定积分Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象练习2重写sum使之能够迭代执行(define(sumtermanextb)(define(iteraresult)(if<??><??>(iter<??><??>)))(iter<??><??>))(>ab)result(nexta)a(+(terma)result)0Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象练习4构造sum的抽象概念accumulate5用accumulate构造sum<??><??>Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象高阶过程-用lambda构造过程问题:能否不定义作为高阶函数参数的pi-term和pi-next简单函数,而直接使用高阶函数?引入Lambda特殊形式来创建所需的过程

(lambda

(x)

(+

x

4))(lambda

(x)

(/

1.0

(*

x

(+

x

2))))(define

(pi-sum

a

b)

(sum

(lambda

(x)

(/

1.0

(*

x

(+

x

2))))

a

(lambda

(x)

(+

x

4))

b))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象高阶过程-用lambda构造过程用lambda构造过程(lambda(<formal-parameters>)<body>)该过程以x为参数过程体((lambda

(x

y

z)

(+

x

y

(square

z)))

1

2

3)lambda可以用在任何使用过程名的上下文中Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象高阶过程-用lambda构造过程如何创建局部变量?Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象高阶过程-用lambda构造过程方法一:利用辅助过程约束局部变量。(define

(f

x

y)

(define

(f-helper

a

b)

(+

(*

x

(square

a))

(*

y

b)

(*

a

b)))

(f-helper

(+

1

(*

x

y))

(-

1

y)))辅助过程Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象高阶过程-用lambda构造过程方法二:利用lambda表达式描述约束局部变量的匿名过程。(define

(f

x

y)

((lambda

(a

b)

(+

(*

x

(square

a))

(*

y

b)

(*

a

b)))

(+

1

(*

x

y))

(-

1

y)))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象高阶过程-用lambda构造过程方法三:利用define的内部定义功能(define

(f

x

y)

(define

a

(+

1

(*

x

y)))

(define

b

(-

1

y))

(+

(*

x

(square

a))

(*

y

b)

(*

a

b)))Scheme语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象语言控制抽象let创建局部变量方法四:利用特殊形式let创建局部变量:(define

(f

x

y)

(let

((a

(+

1

(*

x

y)))

(b

(-

1

y)))

(+

(*

x

(square

a))

(*

y

b)

(*

a

b))))(let

((<var1>

<exp1>)

(<var2>

<exp2>)

(<varn>

<expn>))

<body>)((lambda

(<var1>

﹒﹒﹒<varn>)

<body>)<exp1><expn>)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论