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

标签 scheme racket r5rs

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

(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))
如何修复此功能?

最佳答案

您的语法完全错误。函数主体周围有多余的括号,而cond子句周围没有足够的括号,并且递归情况甚至不在cond内,因此无论测试成功还是失败,它都可以完成。以下过程应该起作用:

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

关于方案获取列表中的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13175152/

相关文章:

recursion - Scheme 中的 Mandelbrot 集实现非常慢

lisp - HTDP 练习 6.6.1 - 模板函数是什么意思?

scheme - Racket/Scheme 编译为单个二进制文件,没有依赖项? FFI 和静态链接

racket - 在 typed/racket 中编写 Y 组合器

list - 如何迭代列表中的每个元素而不删除方案中的元素

image - 如何在 R5RS 中使用图像

scheme - Chez 方案 : Macroexpand implementation

list - 方案:从列表中删除重复的号码

Racket:局部扩展递归定义