繁体   English   中英

检查列表中的所有元素在方案中是否相同

[英]Checking if all elements in a list are the same in scheme

定义一个递归过程“全零?” 它接受一个位列表,并且仅当该列表仅包含零时才返回#t。 我们用单词“ oil”中的第一个和第三个小写字母表示零和一个位。 到目前为止,我有

(define all-zero?
  (lambda (lst)
    (if (equal? lst '(o))
        #t
        (if (equal? (all-zero? (cons (cdr (lst)) '() )) '(o))
            #t
            #f)
        )
    )
  )

但是它返回的变量全零? 没有约束。 我在做错什么,甚至在正确的轨道上吗?

问题中的函数名为all-zero? ,但您将其称为all-zeroes? ,说明了错误。 但是,还有其他更严重的错误:

  • 您将lst括号之间,但是lst不是一个函数: (lst)
  • 递归未正确进行
  • 您应该使用cond代替嵌套if小号

实现此功能的正确方法是检查是否有任何元素为零(返回#f )或继续遍历列表直到其为空,并按照惯例,条件为空列表为#t

(define all-zeroes?
  (lambda (lst)
    (cond ((null? lst) #t)
          ((not (eq? (car lst) 'o)) #f)
          (else (all-zeroes? (cdr lst))))))

使用布尔连接器可以进一步简化上述操作:

(define all-zeroes?
  (lambda (lst)
    (or (null? lst)
        (and (eq? (car lst) 'o)
             (all-zeroes? (cdr lst))))))

根据使用的口译员,您可以更简洁地表达解决方案。 例如,在SRFI-1,您可以使用every或球拍,我们有andmap

(define (all-zeroes? lst)
  (andmap (curry eq? 'o) lst))

无论如何,它可以按预期工作:

(all-zeroes? '(o o o))
=> #t
(all-zeroes? '(o o l))
=> #f

您正在列表中寻找“全零”。 如果列表的第一个元素不是零,那么答案是错误的。 如果第一个元素为零,则继续。 当列表为空时,它全为零。 这自然使用递归表示,如下所示:

(define (all-zero? list)
  (or (null? list)                     ; #t if list is empty
      (and (eq? 'o (car list))         ; head is zero … 
           (all-zero? (cdr list)))))   ; … continue with rest.

您的代码有许多错误和样式错误:

  1. (cdr (lst))最终对lst进行了函数调用,但lst不是函数
  2. 布尔函数,是否equal? 返回#t /#f; 无需将它们添加到您的代码中
  3. 在造型上应避免“悬吊括号”(单独的括号)。
  4. 您的比较是否equal? 应该基于lst的第一个元素

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM