问题描述
定义函数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