2015-04-22 155 views
1

我正在使用Scheme,並試圖以遞歸方式刪除列表中倒數第二個元素。 這是我有:如何從Scheme的列表中刪除第二個到最後一個元素?

(define delete 
    (lambda (num lst) 
    (cond 
     ((equal? (length lst) 1) '()) 
     ((null? lst) '()) 
     (else (cons (car lst)(delete num (cdr lst))))))) 

(define second 
    (lambda(lst) 
    (delete (- (length lst) 1) lst))) 

(second '(1)) 
(second '(3 5 6)) 
(second '(2 7 8 4 9)) 

返回此:

() 
(3 5) 
(2 7 8 4) 

當它應該返回此:

() 
(3 6) 
(2 7 8 9) 

(第二「(1))是做什麼的我打算但我已經與另一部分玩了幾個小時,我仍然處於虧損狀態。任何提示或建議,將非常讚賞在這一點上。編輯: 哇,謝謝!那是一行缺少的代碼-_-杜我!

+0

低於一個很好的答案,你可以爲在列表中有2個元素添加一個特殊的情況?考慮點擊複選標記以給予響應者信用! –

回答

1

您從不使用num參數。所以你會一直迭代,直到列表有1個元素或爲空。

(define delete 
    (lambda (num lst) 
    (cond 
     ((equal? (length lst) 2) (cdr lst)) 
     ((equal? (length lst) 1) '()) 
     ((null? lst) '()) 
     (else (cons (car lst)(delete num (cdr lst))))))) 

(define second 
    (lambda(lst) 
    (delete (- (length lst) 1) lst))) 

由於不使用num的說法,你可以這樣做::

(define delete_second_last 
    (lambda (lst) 
    (cond 
     ((equal? (length lst) 2) (cdr lst)) 
     ((equal? (length lst) 1) '()) 
     ((null? lst) '()) 
     (else (cons (car lst)(delete_second_last (cdr lst))))))) 

(delete_second_last '(3 6 7 9 10)) 
相關問題