[英]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.
您的代码有许多错误和样式错误:
(cdr (lst))
最终对lst
进行了函数调用,但lst
不是函数 equal?
返回#t /#f; 无需将它们添加到您的代码中 equal?
应该基于lst
的第一个元素
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.