Scheme語言控制抽象 全_第1頁
Scheme語言控制抽象 全_第2頁
Scheme語言控制抽象 全_第3頁
Scheme語言控制抽象 全_第4頁
Scheme語言控制抽象 全_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

函數式程序設計語言Scheme語言控制抽象第二部分第二章Scheme語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象參考教材計算機程序的構造和解釋(原書第2版)StructureandInterpretationofComputerPrograms,SecondEditionMassachusettsInstituteofTechnology

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

任何強有力的程序設計語言都必須能表述基本的數據和過程,還需要提供對數據和過程進行組合和抽象的方法?!浴队嬎銠C程序的構造和解釋》Scheme語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象程序設計基本元素1表達式⑴元表達式常量

數486字符串,例如:“hello”布爾值,例如:#f,#t名字例如:+//內部過程例如:pi//由define或其他過程創(chuàng)建的變量⑵組合表達式(前綴表示法)組合:(<operator><operand><operand>…)(+2135127)(+(*3(+(*24)(+35)))(+(-107)6))Scheme語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象2命名命名(definepai3.14159)(defineradius10)(*pai(*radiusradius))(definecircumference(*2pairadius))circumferenceScheme語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象3復合過程過程定義的一般形式:

過程定義在環(huán)境中關聯符號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開始的連續(xù)整數去檢查能否整除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語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象線性的遞歸和迭代兩種計算過程的分析比較:①線性的遞歸計算過程代換模型揭示出一種先展開后收縮的形狀。解釋器需要維護以后將要執(zhí)行的操作的軌跡。對應的計算稱為遞歸計算過程。②線性迭代計算過程狀態(tài)可以用固定數目的狀態(tài)變量描述。解釋器只需要保存有限的狀態(tài)變量的軌跡。對應的計算稱為迭代計算過程。③注意:遞歸過程和遞歸計算過程是兩個不同的概念。遞歸過程的計算也可能是迭代的計算過程。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語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象語言控制抽象樹形遞歸改進:使用迭代計算過程。規(guī)則:(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使之能夠迭代執(zhí)行(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特殊形式來創(chuàng)建所需的過程

(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構造過程如何創(chuàng)建局部變量?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創(chuàng)建局部變量方法四:利用特殊形式let創(chuàng)建局部變量:(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. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論