定义一个递归程序'全零?'获取位列表并返回#t当且仅当列表仅包含零时。我们通过单词" oil"中的第一个和第三个小写字母来表示位0和1。到目前为止我已经
了(define all-zero?
(lambda (lst)
(if (equal? lst '(o))
#t
(if (equal? (all-zero? (cons (cdr (lst)) '() )) '(o))
#t
#f)
)
)
)
但它的返回,变量全零?不受约束。我做错了什么,我是否走在正确的轨道上?
答案 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.
您的代码有许多错误和样式漏洞:
(cdr (lst))
最终对lst
进行函数调用,但lst
不是函数equal?
返回#t / #f;无需将它们添加到您的代码中equal?
的比较应基于lst