Functional programming 为什么这个函数在应该返回false的时候返回true?

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)))

所以,我有一个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)))
              (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)))
(列表(左车)))
(副手(左指挥官)((""))