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

时间:2014-02-12 17:03:00

标签: list recursion scheme equals elements

定义一个递归程序'全零?'获取位列表并返回#t当且仅当列表仅包含零时。我们通过单词" oil"中的第一个和第三个小写字母来表示位0和1。到目前为止我已经

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

但它的返回,变量全零?不受约束。我做错了什么,我是否走在正确的轨道上?

2 个答案:

答案 0 :(得分:1)

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

  • 您在括号内围绕lst,但lst不是函数:(lst)
  • 递归未正确推进
  • 您应该使用cond而不是嵌套if s

实现此函数的正确方法是检查是否有任何元素为零(返回#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的Racket中:

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

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

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

答案 1 :(得分:1)

您正在寻找列表中的“全零”。如果列表的第一个元素不是零,那么你就会得到一个错误的答案;如果第一个元素为零,则继续。当列表为空时,它全部为零。这通过递归自然表达,如下:

(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. 应该避免风格上的“悬挂的parens”(自己在线上的parens)。
  4. 您与equal?的比较应基于lst
  5. 的第一个元素