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

How to delete the 2nd to last element from a list in 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))

return是这个:

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

什么时候应该 return 这个:

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

(第二个'(1))正在做我想要的,但我已经和另一个部分玩了几个小时,但我仍然不知所措。任何提示或建议将不胜感激。

编辑: 哇谢谢你!就是少了一行代码 -_- 哎呀!

您从不使用 num 参数。因此,您将始终迭代,直到列表有 1 个元素或为空。当列表有 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))