首页 > 解决方案 > 为什么这个函数应该返回 false 时返回 true?

问题描述

所以,我有这个辅助函数来检查列表和对列表之间是否存在自反关系。

(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 版。

编辑:更清楚地说,我希望函数在 L 为 '() 作为基本情况时返回#f,这样函数就不需要再进行递归了。

标签: functional-programmingracket

解决方案


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

由于您没有给出定义list-equal?- 我无法运行此代码进行测试。


推荐阅读