【问题标题】:How to check if first and last element in a list are identical (Language: Scheme)如何检查列表中的第一个和最后一个元素是否相同(语言:方案)
【发布时间】:2018-04-12 04:15:13
【问题描述】:

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

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

例如: (endsmatch '(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)))

    )))

我相信我的代码以“(equal?”开头的代码被破坏并且不起作用。这也是我相信递归将发生的地方。感谢任何帮助!

【问题讨论】:

    标签: scheme


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我在编程时倾向于使用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? 中您会检查这一点,因此这不是问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-03
        • 2015-08-22
        • 2020-07-27
        相关资源
        最近更新 更多