需要帮助了解错误F3'6 3 4 1不是实数Lisp代码

问题描述

这是我的Lisp代码。我正在尝试解决此问题:

定义函数f3,该函数将简单的整数列表作为参数并返回整数的数量(计数) 在列表中介于-3和+15之间(包括-3和+15)。例如:

LISP> (f3 '(1 -2 17 -4))
2

这是我的问题,被困住了。我不知道我在做什么错。

(defun f3 (x)
  (if (null x)
      0
    (if (>(car x) - 3) 
        (if (<(car x) 15)
            (+ 1(f3 (cdr x)))
          (f3 (cdr x))
          (f3 (cdr x))))))

解决方法

第二个(f3 (cdr xx))之后没有足够的括号。正如您所看到的,当代码正确缩进时,会将最后2个递归调用放在同一if中;最后一个应该在上一个if中。

但是,if-3不需要单独的15表达式。您可以将测试与and结合使用,或者利用两个端点的比较结果相同的事实,并使用(<= -3 (car x) 15)。还请注意,该问题表明包含端点,因此您应使用<=而不是<

最后,-3之间不应有空格。我怀疑那只是一个复制错误,因为在这种情况下您会遇到另一个错误。

(defun f3 (x)
  (if (null x)
      0
    (if (<=  -3 (car x) 15)
        (+ 1 (f3 (cdr x)))
      (f3 (cdr x)))))
,

Common Lisp是一种非常成熟的语言,因此它的“标准库”中有许多实用的东西。就您而言,您只需要使用函数count-if并编写正确的谓词即可。

(defun count-in-range (values)
       (count-if (lambda (x) (and (>= x -3) (<= x 15))) values))

;; (count-in-range '(1 -2 17 -4))
;; => 2