toa*_*ast 4 lisp recursion clisp
我需要一个递归的LISP函数,它枚举任何数字列表> 3的元素数量.我不允许使用let,loops或whiles,只能使用基本的CAR,CDR,SETQ,COND,CONS,APPEND,PROGN ,列表......
这是我对该功能的尝试:
(defun foo (lst)
(COND ((null lst) lst)
(T (IF (> (CAR lst) 3)
(1+ (foo (CDR lst)))
(foo (CDR lst)) ) ) ) )
Run Code Online (Sandbox Code Playgroud)
函数调用:
(foo '(0 1 2 3 4 5 6))
Run Code Online (Sandbox Code Playgroud)
您的代码非常接近正确,只是基本情况中的一个小错误:
对于空列表,您将返回空列表.因此,如果您有列表(6)
,则添加6个foo
空列表,即空列表.这不起作用,因为您无法在列表中添加数字.
您可以通过foo
返回0
而不是lst
何时lst
为空来轻松修复它.
作为一种风格注释:混合cond
和if
这样,似乎有点多余.我会像这样写,只使用cond
:
(defun foo (lst)
(cond
((null lst)
0)
((> (car lst) 3)
(1+ (foo (cdr lst))))
(T
(foo (cdr lst)))))
Run Code Online (Sandbox Code Playgroud)
一些风格点:
DEFUN
和NULL
?if
在你的最后一个分支内cond
.这是多余的.既然cond
是测试条件的目的,为什么不用呢?lst
来避免与内置函数冲突list
.如果你是真的编程,当然你会使用count-if
:
(count-if #'(lambda (x) (> x 3)) '(0 1 2 3 4 5 6))
==> 3
Run Code Online (Sandbox Code Playgroud)