2010-02-17 29 views

回答

5

找到最後一個列表:

(define (last l) 
    (cond ((null? (cdr l)) (car l)) 
      (else (last (cdr l))))) 

使用地圖,最後映射到一個列表:

(map last '((a b) (c d) (e f))) 
==> (b d f) 

這樣一個新功能:

(define (last-list l) 
    (map last l) 
) 

(last-list '((a b) (c d) (e f))) 
==> (b d f) 
+0

這將返回每個子列表的最後一個元素...不是他所要求的,盡我所知。是? – 2010-02-17 06:11:43

+0

這是他問史蒂文,仔細看看原來的問題(而不是代碼)。 – McPherrinM 2010-02-17 06:14:23

3

你的代碼」已經寫了 - 採取列表的最後一個元素 - 是正確返回列表的最後一個元素。你有一個列表清單。有一個外部列表

(x y z) 

其中

x = (a b) 
y = (c d) 
z = (e f) 

所以你得到的名單中,Z,這是(EF)

你希望你的最後一個函數的最後一個元素做不同的事情?如果您希望它返回最後一個嵌套列表的最後一個元素,則需要更改基本大小寫。現在你回車了。相反,你想檢查汽車是否是一個列表,然後調用你的嵌套最後的功能。

有意義嗎?

1

你的最後一個功能是好的,但你要想想你想現在用它做什麼。

你有一個列表的列表,並且你想利用最後所有這些的。

所以遞歸下你每次應用它列表:

(define (answer lst) 
    (cond ((null? (cdr l)) null) 
     (else (cons (last (car l)) (answer (cdr lst)))) 
1

另一種可能性:

(define (last thelist) 
    (if 
     (null? (cdr thelist)) (car thelist) 
     (last (cdr thelist)))) 

(define (all-last lists) (map last lists)) 

編輯:剛纔看到你不知道map,並想辦法解決,沒有它:

(define (all-last lists) 
    (if 
     (null? lists) `() 
     (cons (last (car lists)) (all-last (cdr lists))))) 

至於獲得一個空列表,我猜你試圖使用這種地圖狀前端與你原來的last定義,而它打算與last定義我上面給了工作。請嘗試以下定義:

(define (last thelist) (if 
       (null? (cdr thelist)) (car thelist) 
       (last (cdr thelist)))) 

(define (all-last lists) (if 
         (null? lists) `() 
         (cons (last (car lists)) (all-last (cdr lists))))) 

和運行快速測試:

(全最後`((AB)(CD)(EF)))

的宜結果是:

(BDF)

4

未必是最有效的,但肯定是最簡單的一個:

(define (last lst) 
    (car (reverse lst))) 

例子:

(last '(1 2 3 4)) => 4  
(last '((a b) (b c) (d e))) => (d e) 
0
(define last 
    (lambda (ls) 
    (list-ref ls (- (length ls) 1)))) 
0

我喜歡短的,甜甜的,速度快,尾遞歸過程。

命名let是我的朋友。

這解決了原來的問題,並返回#f,如果列表沒有最後一個元素。

(定義(最後L)(讓F((最後#F)(LL))(如果(空?L)去年(F(車L)(CDR L)))))

0

(define (last lst) 
    (cond [(empty? lst) empty] 
     [(empty? (rest lst)) (first lst)] 
     [else (last (rest lst))])) 
相關問題