我需要在Scheme中删除列表的最后一个元素。
例如,假设我有一个列表(1 2 3 4)
。我需要返回:
(1 2 3)
我的想法:
reverse(list)
car(list)
reverse(list)
在scheme(racket)中是否有一个reverse
函数?
我需要在Scheme中删除列表的最后一个元素。
例如,假设我有一个列表(1 2 3 4)
。我需要返回:
(1 2 3)
我的想法:
reverse(list)
car(list)
reverse(list)
在scheme(racket)中是否有一个reverse
函数?
你写的是:"reverse, car, reverse"。我认为你的意思是"reverse, cdr, reverse"。这个解决方法没有问题;它与使用标准列表的任何解决方法一样,都是线性的。
代码如下:
;; all-but-last: return the list, not including the last element
;; list? -> list?
(define (all-but-last l) (reverse (cdr (reverse l))))
如果对列表的多次遍历或不必要的另一个列表副本构造感到困扰,您可以通过直接编写该内容来避免它。
鉴于你几乎已经解决了问题,我假设这不是作业。
以下是 racket 的代码示例:
#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))
虽然有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
检查是否在列表的最后一个元素。
SRFI 1(在Racket中使用(require srfi/1)
激活)有一个drop-right
函数:
(drop-right '(1 2 3 4) 1) ; => (1 2 3)
require
。 - Meow(define (last-one liste)
(if(null? (cdr liste))
null
(cons (car liste) (last-one (cdr liste)))
)
)
cons
将元素连接起来,如果它后面没有元素,则不添加任何内容。
虽然我已经好几年没写Scheme了,但这就是我的建议。
有人可以继续实现它(除非这是作业,否则他们可能不应该!)
append
。(你可以在每次迭代中使用 cons
--- 这是 O(1) 的 --- 但这不叫做 appending。) - C. K. Young(define (removing-last xx)
(remove (list-ref xx (- (length xx) 1)) xx))
(removing-last '(1 2 3 4 2))
吗? - mnemenaut'(1 2 3 4)
。 - Parmida Pourmatinremove
函数用于移除列表中的元素。建议实际运行代码以确认效果。 - mnemenaut(define (removelast mylist)
(cond
[(empty? (rest mylist)) empty]
[(cons? mylist) (cons (first mylist) (removelast (rest mylist)))]))
(removelast (list 1 2 3 4 5))