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

Return the first and last element in the list Scheme

非常简单的问题。我最初的方法是定义另一个过程来在 first-last 中找到 lst 的最后一个元素。找到最后一个元素后,我将它附加到 lst (car lst) 的第一个元素。 这就是 append 的工作原理。 (附加列表 1 列表 2) 例如,(附加'(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

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

append 仅适用于加入 两个或多个列表。不过,在这里,您不是加入现有列表,而是从两个元素构建列表。为此,使用 list:

(list (car lst) (last lst))

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

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

当然,您可以 return 在 catch-all 子句中使用 #f 以外的内容。