如何从Scheme中的列表中删除倒数第二个元素?

时间:2015-04-22 07:06:44

标签: 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))正在按照我的意图行事,但是我和其他部分一起玩了几个小时,我仍然不知所措。任何提示或建议都会非常感激。

编辑: 哇谢谢你!这是一行缺失代码-_- Duh me!

1 个答案:

答案 0 :(得分:1)

你永远不会使用num参数。因此,您将始终迭代,直到列表包含1个元素或为null。当列表包含2个元素时,您可以添加一个特殊情况:

(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))