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

时间:2012-11-01 10:28:33

标签: scheme racket r5rs

我试图写一个简单的scheme函数,它返回列表的最后一个元素。我的功能看起来应该可以工作,但我设法失败了:

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

如何修复此功能?

4 个答案:

答案 0 :(得分:10)

您的语法完全错误。你在函数体周围有一组额外的括号,cond子句周围的括号不够,你的递归情况甚至不在cond范围内,所以无论测试成功还是失败。以下程序应该有效:

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

答案 1 :(得分:5)

只需添加:在专业级Racket中,last函数是racket/list库的一部分。

答案 2 :(得分:2)

您可以通过调用

来检索列表的最后一个元素

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

或者,如果是内置的,则递归使用

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

答案 3 :(得分:0)

你也可以这样做。首先通过cd down来找到列表的长度。然后使用list-ref x给出列表的x元素。 例如list-ref yourlistsname 0给出了第一个元素(基本上是列表中的car。)和(list-ref yourlistsname( - length 1))给出列表的最后一个元素。