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

问题描述 投票:0回答:8

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

例如,假设我有一个列表

(1 2 3 4)
。我需要返回:

(1 2 3)

我的想法:

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

scheme(racket)中有

reverse
功能吗?

scheme racket
8个回答
24
投票

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

如代码:

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

11
投票

有一个

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
检查它是否位于列表的最后一个元素。


10
投票

SRFI 1(使用

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

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

2
投票

我会执行一个递归函数,如果后面的元素不是最后一个,则沿着列表向下移动并附加该元素(使用

cons
),如果不是最后一个,则不附加任何内容。

我已经很多年没有做过计划了,所以这就是我能做的。

有人可以运行如何实现它(除非这是家庭作业,否则他们可能不应该!)


2
投票

我做了一些比以下更简单的事情:reverse(list),car(list),reverse(list)来获取最后一个元素,看看:

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

1
投票

那些正在寻找其他方法的人可以看看这个:

(define (removing-last xx)
(remove (list-ref xx (- (length xx) 1)) xx))

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 的子集。


0
投票
(define
  (exceptLast ls)
  (reverse (cdr (reverse ls)))
)
© www.soinside.com 2019 - 2024. All rights reserved.