删除列表的最后一个元素(方案)

时间:2011-02-15 16:55:34

标签: scheme racket

所以我必须删除方案中列表的最后一个元素。

例如,假设我有一个列表(1 2 3 4)。我需要回复:

(1 2 3)

我的想法:

reverse(list)
car(list)
reverse(list)

方案(球拍)中是否有reverse功能?

6 个答案:

答案 0 :(得分:21)

你写道:“倒车,倒车”。我相信你的意思是写“反向,反向,反向”。这个解决方案没有错;它与列表的大小呈线性关系,就像使用标准列表的任何解决方案一样。

代码:

;; all-but-last: return the list, not including the last element
;; list? -> list?
(define (all-but-last l) (reverse (cdr (reverse l))))

如果列表的多次遍历或其他列表副本的不必要构造困扰您,您可以通过直接编写该事物来避免它。

鉴于你几乎可以解决,我会假设这不是作业。

这就是它在球拍中的样子:

#lang racket

(require rackunit)

;; all-but-last : return the list, except for the last element
;; non-empty-list? -> list?
(define (all-but-last l)
  (cond [(empty? l) (error 'all-but-last "empty list")]
        [(empty? (rest l)) empty]
        [else (cons (first l) (all-but-last (rest l)))]))

(check-equal? (all-but-last '(3 4 5))
              '(3 4))

答案 1 :(得分:6)

有一个reverse,但使用它不会非常有效。我建议使用以下递归函数。

(define (remove-last lst)
    (if (null? (cdr lst))
        '()
        (cons (car lst) (remove-last (cdr lst)))))

(remove-last '(1 2 3 4)) ; returns '(1 2 3)

if检查它是否在列表的最后一个元素。

答案 2 :(得分:5)

SRFI 1(使用(require srfi/1)在Racket中激活)具有drop-right功能:

 (drop-right '(1 2 3 4) 1)   ; => (1 2 3)

答案 3 :(得分:2)

我会做一个递归函数,在列表中下移并附加元素(使用cons)如果后面的元素不是最后一个,如果不是则不附加任何内容。

我已经多年没有完成计划了,所以这就是我可以去的地方。

有人可以运行如何实现它(除非它的功课,然后他们可能不应该!)

答案 4 :(得分:1)

我做了一些简单的事情:反向(列表),汽车(列表),反向(列表)以获取最后一个元素,结帐:

(define (last-one liste)
  (if(null? (cdr liste))
     null
     (cons (car liste) (last-one (cdr liste)))
  )
)

答案 5 :(得分:0)

我会写一个简单的递归,将典型的“empty?mylist”基本情况改为“empty?(rest mylist)”,这样当输入列表只有1个元素时我就可以返回空。

(define (removelast mylist)
  (cond
    [(empty? (rest mylist)) empty]
    [(cons? mylist) (cons (first mylist) (removelast (rest mylist)))]))

(removelast (list 1 2 3 4 5))

顺便说一下,这段代码是在Racket / PLT Scheme中,是Scheme的一个子集。