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

问题描述 投票:0回答:2

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

(endsmatch lst)如果列表中的第一个元素与列表中的最后一个元素相同,则返回#t,否则返回#f。

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

(endmatch(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)))

    )))

我相信我的代码从“(相等?”开始,它被破坏并且不起作用。这也是我相信递归将发生的地方。任何帮助都表示赞赏!

scheme
2个回答
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)作为最后一行中的第二个参数传递的原因是它也适用于单元素列表。


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?中你检查这个,因此这不是问题。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.