Functional programming 为什么这个函数在应该返回false的时候返回true?
所以,我有一个helper函数,它检查列表和成对列表之间是否存在自反关系Functional programming 为什么这个函数在应该返回false的时候返回true?,functional-programming,racket,Functional Programming,Racket,所以,我有一个helper函数,它检查列表和成对列表之间是否存在自反关系 (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)))
(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:更清楚地说,我希望函数在L为“()”时返回#f作为基本情况,这样函数就不需要再进行递归。您将
if
表单放在cond
中,这是非常多余的。
因此,您的错误肯定是您对cond
语法缺乏理解。
记住cond
语法如下:
(cond (condition1 what-to-do-if-condition1-is-true)
(condition2 what-to-do-if-condition2-is-true)
( ... ... )
(else what-to-do-if-none-of-the-conditions-listed-above-evaluated-to-true))
因此,我形成了你的表达方式:
(define helper
(lambda (L S)
(cond ((equal? L '()) #f)
((and (equal? S (car (car L))) (list-equal? (car L))) #t)
(else (helper (cdr L) S)))))
由于您没有给出
列表相等的定义?
-我无法运行此代码进行测试。您将if
表单放在cond
中,这是非常多余的。
因此,您的错误肯定是您对cond
语法缺乏理解。
记住cond
语法如下:
(cond (condition1 what-to-do-if-condition1-is-true)
(condition2 what-to-do-if-condition2-is-true)
( ... ... )
(else what-to-do-if-none-of-the-conditions-listed-above-evaluated-to-true))
因此,我形成了你的表达方式:
(define helper
(lambda (L S)
(cond ((equal? L '()) #f)
((and (equal? S (car (car L))) (list-equal? (car L))) #t)
(else (helper (cdr L) S)))))
由于您没有给出
列表相等的定义?
-我无法运行此代码进行测试。您已将if
嵌套在cond
中。让我们重写您的som代码,使其完全相同:
(定义助手)
(兰姆达(L S)
让(结果)
(如果(等于L’())
#f
(如果(等于S(轿厢(轿厢L)))
(如果(列表相等)(L车))
#t
(助手(cdr L)S)
(副手(左指挥官)((""))
(续)
(结果)
(else的实现定义值(()()))
如果前面的谓词都没有命中,cond
将返回一个实现定义的值,作为else
子句。由于您的基本casse返回#f
,因此将转到默认的else
情况
由于另一个答案用cond
显示代码,因此如果,则与相同:
(定义助手)
(兰姆达(L S)
(如果(等于L’())
#f
(如果(和(等于)S(汽车(汽车L)))
(列表(左车)))
#t
(副手(左指挥官)((""))
您也只能使用和和或编写此代码:
(定义助手)
(兰姆达(L S)
(和(第1对)
(或(和(相等的)S(汽车(汽车L)))
(列表(左车)))
(副手(左指挥官)((""))
在cond
中嵌套了if
。让我们重写您的som代码,使其完全相同:
(定义助手)
(兰姆达(L S)
让(结果)
(如果(等于L’())
#f
(如果(等于S(轿厢(轿厢L)))
(如果(列表相等)(L车))
#t
(助手(cdr L)S)
(副手(左指挥官)((""))
(续)
(结果)
(else的实现定义值(()()))
如果前面的谓词都没有命中,cond
将返回一个实现定义的值,作为else
子句。由于您的基本casse返回#f
,因此将转到默认的else
情况
由于另一个答案用cond
显示代码,因此如果,则与相同:
(定义助手)
(兰姆达(L S)
(如果(等于L’())
#f
(如果(和(等于)S(汽车(汽车L)))
(列表(左车)))
#t
(副手(左指挥官)((""))
您也只能使用和和或编写此代码:
(定义助手)
(兰姆达(L S)
(和(第1对)
(或(和(相等的)S(汽车(汽车L)))
(列表(左车)))
(副手(左指挥官)((""))