如何检查列表中的第一个和最后一个元素是否相同(语言:Scheme)

时间:2018-04-11 07:00:44

标签: scheme

我正在编写Scheme中的程序,并且在这一部分中遇到了困难。下面是一个让我的问题清晰的例子

如果列表中的第一个元素与列表中的最后一个元素相同,

(endsmatch lst)应返回#t,否则返回#f。

例如: (endmatch'(s t u v w x y z))应返回:#f

(endsmatch(LIST'j'k'l'm'n'o'j))应该返回:#t

这是我到目前为止所做的(只是错误处理)。我遇到的主要问题是解决这个递归。我知道有更简单的解决方案不是递归的,但我需要使用递归来解决这个问题。

到目前为止我的代码:

    (define (endsmatch lst)

       (if (not(list? lst))     
          "USAGE: (endsmatch [list])"

          (if (or (null? lst)
              (= (length lst) 1))
              #t

          (equal? ((car lst)) (endsmatch(car lst)))

    )))

我相信我的代码从“(等于?”开始,它被破坏并且不起作用。这也是我相信递归的地方。感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

最简单的方法是使用(递归)辅助函数来进行循环:

(define (endsmatch lst)

  (define (helper no1 lst)
    (if (null? (cdr lst))
        (equal? no1 (car lst))
        (helper no1 (cdr lst))))

  (if (or (not (list? lst)) (null? lst))
      "USAGE: (endsmatch [list])"
      (helper (car lst) lst)))

我将lst而非(cdr lst)作为最后一行中的第二个参数传递的原因是它也适用于单元素列表。

答案 1 :(得分:0)

我倾向于在编程时使用KISS。又名。 "保持简单,愚蠢!" 在这方面,我会为以下方面做准备:

(define (ends-match? lst)
  (or (null? lst)
      (equal? (car lst)
              (last lst))))

现在last我们可以这样定义:

(define (last lst)
  (foldl (lambda (e a) e) last lst))

它并不完美。如果您传递一个空列表,它应该发出错误信号,但是在ends-match?中您检查了这一点,因此它不是问题。