所以,我有这个辅助函数,它检查列表和对列表之间是否存在自反关系 .
(define helper
(lambda (L S)
(cond
((if (equal? L '()) #f ;; here, when L equals empty list, it should return #f, but somehow it returns #t even if L is '().
(if (equal? S (car (car L)))
(if (list-equal? (car L))#t
(helper (cdr L) S))
(helper (cdr L) S))))
)))
但是,即使列表是空列表,它检查L是否为空列表的部分也返回true,允许我的其他函数返回true . 我一直难以理解为什么它会在几小时内返回#t而不是#f . 请帮我弄清楚这是怎么回事 . 哦,我正在使用Dr.Racket版本6.12 .
EDIT: 更清楚,我希望函数返回#f时L是'() as a base case so that the function doesn' t需要再做递归 .
2 回答
你把
if
表格放在cond
中,这是多余的 . 所以你的错误肯定是你对cond
语法缺乏了解 . 请记住cond
语法如下:所以我相应地形成了你的表达:
由于您未给出
list-equal?
的定义 - 我无法运行此代码进行测试 .您已在
cond
中嵌套if
. 让我们重写你的代码som相同的东西:cond
将返回实现定义的值,因为else
子句不应该先前的谓词命中 . 由于您的基本casse返回#f
,它将转到默认的else
情况 .由于其他答案显示的代码为
cond
,因此if
与此相同:你也可以用
and
和or
来写这个: