2013-04-14 85 views
0

我是新來的方案。我試圖以這樣一種方式截斷列表,即新列表不應包含第一個和最後一個元素。方案 - 截斷列表

在此先感謝。

回答

2

有很多方法可以做到這一點,一個可能性是使用drop-right刪除最後一個元素和rest(或cdr),用於去除第一個元素:

(define lst '(1 2 3 4 5)) 
(rest (drop-right lst 1)) 
=> '(2 3 4) 

如果drop-right是在你的解釋不可用,那麼只需實現一個過程,該過程返回輸入列表中除最後一個之外的所有元素的新列表。你甚至可以在一個過程中結合去除這兩個元素。下面是該解決方案的總體思路,假設名單至少有兩個元素(否則會出現錯誤) - 填寫的空白:

(define (truncate-first-last lst) 
    (define (drop-last lst)   ; helper procedure for removing last element 
    (if <???>      ; if the rest of the list is empty 
     <???>      ; then return the empty list 
     (cons <???>    ; else `cons` the first element 
       (drop-last <???>)))) ; and advance the recursion 
    (drop-last <???>))    ; call helper, remove first element from list 

不要忘了測試:

(truncate-first-last '(1 2 3 4 5)) 
=> '(2 3 4) 
+0

是任何其他方式,因爲我們不能用得落右 – neham

+0

代替'rest'使用'cdr'的(如上所述)。至於'drop-right',正如最後一段所暗示的那樣,執行一個'drop-last'過程很簡單:只要在創建一個新列表時使用輸入列表(使用這種操作的模板,它在教科書),唯一不同的是當列表的'cdr'爲'null?'時遞歸結束,而不是當列表爲'null'時結束遞歸,通常情況下爲 –

+0

Lopez - 你在這裏引用的教科書 – neham

1

你可以這樣來做:

(define (compose f1 . fn) 
    (cond ((null? fn) f1) 
     (else (let ((fr (apply compose fn))) 
       (lambda (x) (f1 (fr x))))))) 


(define truncate-first-last (compose reverse cdr reverse cdr)) 

> (truncate-first-last '(1 2 3 4)) 
(2 3)