获取列表中最后一个元素的方案

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

我正在尝试编写一个简单的方案函数,它返回列表的最后一个元素。我的函数看起来应该可以工作,但我在某些事情上失败了:

(define (last_element l)(
  (cond (null? (cdr l)) (car l))
  (last_element (cdr l))
))

(last_element '(1 2 3)) should return 3

DrRacket 不断给我错误:

mcdr: contract violation
  expected: mpair?
  given: ()

既然

(null? '())
是真的,我不明白为什么这不起作用。

这是一个我认为我需要做作业的函数(写函数

last-element
不是作业),并且说明说我不能使用内置函数
reverse
,所以我不能只是做
(car (reverse l))

如何修复此功能?

scheme racket r5rs
5个回答
13
投票

你的语法完全错误。您在函数主体周围有一组额外的括号,而在

cond
子句周围不够,并且您的递归情况甚至不在
cond
内,因此无论测试成功还是失败,它都会完成。以下程序应该有效:

(define (last_element l)
  (cond ((null? (cdr l)) (car l))
        (else (last_element (cdr l)))))

8
投票

补充一下:在专业级 Racket 中,last 函数是 racket/list 库的一部分。


3
投票

您可以通过调用

检索列表的最后一个元素

(define (lastElem list) (car (reverse list)))

或者,递归使用 if 内置

(define (last list) 
   (if (zero? (length (cdr list))) 
      (car list) 
      (last (cdr list))))


0
投票

你也可以这样做。首先通过 cdring 找到列表的长度。然后使用 list-ref x 给出列表的 x 元素。 例如 list-ref yourlistsname 0 给出第一个元素(基本上是列表的汽车。)并且 (list-ref yourlistsname (- length 1)) 给出列表的最后一个元素。


0
投票

我认为当今大多数计划的实现都有一个

list-ref
函数,可以与
length
一起使用来获取列表的最后一个元素:

(define (last-elem some-list)
  (list-ref some-list (- (length some-list) 1)))

(last-elem '(a b c d)) ; => d
© www.soinside.com 2019 - 2024. All rights reserved.