星期一, 10月 07, 2013

初探Higher Order Procedure(一)

若一支程序會去修改一另支程序,來達成某種目的,則此程序可稱之為Higher Order Procedure。此外,此程序的參數要是程序。接下來的說明就用Scheme語言來表示。

現在舉一個例子,我們需要寫一支程序,能把某區間的所有整數相加後回傳,Scheme程序如下:

(define (sum-integer a b)
  (if (> a b)
      0
      (+ a (sum-integer (+ a 1) b)))

使用此程序能把從a到b間的整數相加。而今天有另外一件事,是想要相加某區段立方體體積,則可以用下列程序表示:

(define (cube x) (* x x x))
(define (sum-cube a b)
  (if (> a b)
      0
      (+ (cube a) (sum-cube (+ a 1) b)))

可以觀察到sum-integer及sum-cube都有很大程度的相似,這時就可以用Higher Order Procedure來簡化。未來有各種類似工作,都可以此輕鬆達到相同目的:

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

term是用來產生每一個單位的程序。next則是接後現在的值,產生下一個要處理的值。a及b不消分說,就是開始以及結束了。使用此Higher Order Procedure後,我們可以改寫原本的sum-integer & sum-cube如下:

(define (identity x) x)
(define (sum-integer a b)
  (sum identity a 1+ b))
(define (cube x) (* x x x))
(define (sum-cube a b)
  (sum cube a 1+ b))

多有用的一種程序。能把程序寫的簡單又明瞭,除了Scheme以外,我想用其他現在流行的程式語言(C, C++, Java, C#)要達到相同效果,無非是邯鄲學步吧!光是要能直接用程序作為參數,Java就需要借用Command Pattern才行......

沒有留言: