所以我必须删除方案中列表的最后一个元素。
例如,假设我有一个列表(1 2 3 4)
。我需要回复:
(1 2 3)
我的想法:
reverse(list)
car(list)
reverse(list)
方案(球拍)中是否有reverse
功能?
答案 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的一个子集。