8

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

(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

4 回答 4

13

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

(define (last_element l)
  (cond ((null? (cdr l)) (car l))
        (else (last_element (cdr l)))))
于 2012-11-01T10:40:08.900 回答
7

补充一点:在专业级的球拍中,最后一个函数是球拍/列表库的一部分。

于 2012-11-01T23:00:35.887 回答
2

您可以通过调用检索列表的最后一个元素

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

或者,递归使用 if 内置

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

于 2018-07-06T02:32:35.740 回答
0

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

于 2014-12-16T14:19:13.377 回答