检查原子是否是Scheme中列表的最后一个元素

时间:2013-12-02 19:27:36

标签: scheme lisp

我试图解决一个问题,即检查天气,元素x是列表的最后一个元素 我的尝试是:

(Define (last x L)
  (Cond 
    ((NULL? (cdr L)) (EQ? x (car L)) #T )
    (else (last x (cdr L)))))

但我觉得有些不对劲。请你能帮助我吗?
谢谢

1 个答案:

答案 0 :(得分:0)

这将是正确的版本:

(define (last? elt lst)
  (cond
    ((null? lst)       #f)
    ((null? (cdr lst)) (eq? elt (car lst)))
    (else              (last? elt (cdr lst)))))
  • 您还需要检查空列表
  • (eq? x (car lst))已经产生布尔值,无需添加#t
  • Scheme是区分大小写的,你需要注意这个
  • 在Scheme中
  • ,谓词名称(程序返回true或false)以问号结尾
  • x不是一个非常富有表现力的名字,通常不会使用诸如L之类的大写字母;易于理解的变量名称为elt(对于“元素”)和lst(对于“列表”)
  • 此外,缩进对于可读性非常重要,您的编辑应该帮助您正确缩进

该程序也可以简单地写成

(define (last? elt lst)
  (if (null? lst)
      #f
      (eq? elt (car (reverse lst)))))

甚至更短:

(define (last? elt lst)
  (and (not (null? lst))
       (eq? elt (car (reverse lst)))))