我需要一个递归LISP函数来枚举任何大于3的数字列表中的元素数量。我不允许使用let、循环或whiles,只能使用基本的CAR、CDR、SETQ、COND、CONS、APPEND、PROGN、LIST...
这是我在函数中的尝试:
(defun foo (lst)
(COND ((null lst) lst)
(T (IF (> (CAR lst) 3)
(1+ (foo (CDR lst)))
(foo (CDR lst)) ) ) ) )函数调用:
(foo '(0 1 2 3 4 5 6))发布于 2010-11-19 06:44:59
您的代码非常接近正确,只是在基本情况下出现了一个小错误:
对于空列表,您将返回空列表。所以如果你有一个列表(6),你需要在空列表的foo上加上6,这就是空列表。这不起作用,因为您不能将数字添加到列表中。
当lst为空时,您可以通过让foo返回0而不是lst来轻松解决这个问题。
作为一个风格说明:像这样混合cond和if,似乎有点多余。我会这样写它,只使用cond:
(defun foo (lst)
(cond
((null lst)
0)
((> (car lst) 3)
(1+ (foo (cdr lst))))
(T
(foo (cdr lst)))))发布于 2010-11-19 06:55:44
一些风格上的要点:
DEFUN和DEFUN在你的cond的最后一个分支中放一个if呢?这是多余的。既然cond的目的是测试条件,为什么不使用它呢?lst来避免与内置函数list.冲突
如果您真的要对此进行编程,您当然会使用count-if
(count-if #'(lambda (x) (> x 3)) '(0 1 2 3 4 5 6))
==> 3发布于 2018-09-11 09:11:17
对于重复的递归调用,您可以节省一个成本:
(defun foo (l)
(if (null l) 0 ; if list is empty, return 0
(+ (if (> (car l) 3) 1 0) ; else +1 if condition is satisfactory
(foo (cdr l))))) ; plus the result from the resthttps://stackoverflow.com/questions/4220349
复制相似问题