所以我必须删除方案中列表的最后一个元素。
例如,假设我有一个列表
(1 2 3 4)
。我需要返回:
(1 2 3)
我的想法:
reverse(list)
car(list)
reverse(list)
scheme(racket)中有
reverse
功能吗?
您写道:“倒车,汽车,倒车”。我相信你的意思是写“反向,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))
有一个
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
检查它是否位于列表的最后一个元素。
我会执行一个递归函数,如果后面的元素不是最后一个,则沿着列表向下移动并附加该元素(使用
cons
),如果不是最后一个,则不附加任何内容。
我已经很多年没有做过计划了,所以这就是我能做的。
有人可以运行如何实现它(除非这是家庭作业,否则他们可能不应该!)
我做了一些比以下更简单的事情:reverse(list),car(list),reverse(list)来获取最后一个元素,看看:
(define (last-one liste)
(if(null? (cdr liste))
null
(cons (car liste) (last-one (cdr liste)))
)
)
那些正在寻找其他方法的人可以看看这个:
(define (removing-last xx)
(remove (list-ref xx (- (length xx) 1)) xx))
我会编写一个简单的递归,将典型的“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 的子集。
(define
(exceptLast ls)
(reverse (cdr (reverse ls)))
)