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

cal*_*pto 8 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
Run Code Online (Sandbox Code Playgroud)

DrRacket继续给我错误:

mcdr: contract violation
  expected: mpair?
  given: ()
Run Code Online (Sandbox Code Playgroud)

既然(null? '())是真的,我不明白为什么这是行不通的.

这是一个函数,我认为我需要做一个家庭作业(编写函数last-element不是赋值),而且说明说我不能使用内置函数reverse,所以我不能只做(car (reverse l))

我该如何修复这个功能?

Bar*_*mar 12

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

(define (last_element l)
  (cond ((null? (cdr l)) (car l))
        (else (last_element (cdr l)))))
Run Code Online (Sandbox Code Playgroud)

  • @calccrypto这个答案的玻璃半完整版本是你几乎所有的个别元素都是正确的.请记住,圆括号与花括号不同; 你会想要打破"开放"(第一行上的``,并把`)放在自己的行上的习惯.另外,让DrRacket引导您缩进.你很快就会掌握它. (5认同)

dyo*_*yoo 5

只需添加:在专业级Racket中,最后一个功能是球拍/列表库的一部分.