返回列表Scheme中的第一个和最后一个元素

时间:2016-04-11 23:51:34

标签: scheme

非常直截了当的问题。我最初的方法是定义另一个程序来查找lst中的最后一个元素。找到最后一个元素后,我用lst(car lst)的第一个元素添加它。 这是追加工作的方式。 (追加list1 list2)     例如,(追加'(1 2 3)'(2 1 5)) - > (1 2 3 2 1 5) 我想知道问题是否只是我的语法,但我不确定。

(define (first-last lst)
 (define (last lst)
  (cond ((null? (cdr lst))(car lst))
  (else (last (cdr lst)))))
(append(car lst)(last lst)))

错误发生在

(append(car lst)(last lst)))

“mcar:合同违规

预计:mpair?

给出:1“

这是我关于堆栈的第一个问题,所以如果问题没有以正确的方式呈现,我很抱歉。

2 个答案:

答案 0 :(得分:1)

append is only for joining two or more lists. Here, though, you're not joining existing lists, but building a list from two elements. For that, use list:

(list (car lst) (last lst))

答案 1 :(得分:1)

如果您可以使用match,可以使用一个简洁的解决方案:

(define first-last
  (lambda (x)
    (match x
           ((first rest ... last)
            (list first last))
           ((only) (list only only))
           (_ #f))))

当然,你可以在catch-all子句中返回#f以外的东西。