1. 程式人生 > >SICP 習題 (2.20)解題總結: 不確定數量引數

SICP 習題 (2.20)解題總結: 不確定數量引數

SICP 習題 2.20 引入了一種新的函式呼叫方式,就是帶. 符號的不確定引數呼叫方式。

題中也講到了, Scheme支援這種呼叫方式,如果我們把方法定義成下面這個樣子

(define (my-method first-p  .  others-p)
  ;…..
)


我們就可以在呼叫方法my-method時傳入大於2的任何數量的引數,比如:

(my-method 1 2 3 4 5 6)

這時my-method獲得兩個變數,first-p是1,而others-p是一個list,成員有2 3 4 5 6,就是說others-p等於(2 3 4 5 6)

題目要求我們實現一個叫same-parity的方法,該方法接受不確定數量的引數,返回和第一個引數具有同樣奇偶性的所有引數。

這道題不難,題目的意思主要是介紹這種不確定數量引數的使用方式。

方法定義如下:

(define (same-parity first . others)
  (display first)
  (newline)
  (display others)
  (newline)
  (if (not (null? others))
      (if (odd? first)
	  (cons first (filter odd? others))
	  (cons first (remove odd? others)))
      (list first)))

這裡有點偷懶,使用了系統的filter過程和remove過程, 系統的filter過程可以返回一個列表中滿足條件的成員,而系統過程remove返回所有不滿足條件的成員。

而odd?過程也是一個系統過程,用於判斷一個數的奇偶性。

不過方法裡面加了兩行列印程式碼,用於列印first引數和others引數,這樣在測試的時候可以更清楚地觀察兩個引數的值。