我试图写一个简单的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))
如何修复此功能?
答案 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))给出列表的最后一个元素。