基本 LISP 递归,枚举大于 3 的值
我需要一个递归 LISP 函数来枚举任意数字列表中的元素数量 > 3.我不允许使用let、loops或while,只能使用基本的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))
I need a recursive LISP function that enumerates the number of elements in any list of numbers > 3. I'm not allowed to use lets, loops or whiles and can only use basic CAR, CDR, SETQ, COND, CONS, APPEND, PROGN, LIST...
This is my attempt at the function:
(defun foo (lst)
(COND ((null lst) lst)
(T (IF (> (CAR lst) 3)
(1+ (foo (CDR lst)))
(foo (CDR lst)) ) ) ) )
The function call:
(foo '(0 1 2 3 4 5 6))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您的代码非常接近正确,只是基本情况下的一个小错误:
对于空列表,您返回空列表。所以如果你有列表
(6)
,你将6添加到空列表的foo
中,这就是空列表。这不起作用,因为您无法将号码添加到列表中。当
lst
为空时,您可以通过使foo
返回0
而不是lst
来轻松修复此问题。作为风格注释:像这样混合
cond
和if
似乎有点多余。我会这样写,只使用cond
代替:Your code is pretty close to correct, just a small mistake in the base case:
For the empty list you return the empty list. So if you have the list
(6)
, you add 6 tofoo
of the empty list, which is the empty list. That does not work because you can't add a number to a list.You can easily fix it by making
foo
return0
instead oflst
whenlst
is empty.As a style note: Mixing
cond
andif
like this, seems a bit redundant. I would write it like this, using onlycond
instead:一些风格要点:
DEFUN
和NULL
呢?cond
的最后一个分支中有一个if
。这是多余的。既然cond
的目的是测试条件,为什么不使用它呢?lst
以避免与内置函数list
发生冲突。如果您是真实编程,那么您当然会使用
count-如果
:Some stylistic points:
DEFUN
andNULL
?if
inside the last branch of yourcond
. This is redundant. Since the purpose ofcond
is testing conditions, why not use it?lst
to avoid conflicting with the built-in functionlist
.If you were programming this for real, of course you'd use
count-if
:您可以在重复递归调用时进行一项保存:
One save you can have on duplication of the recursive call: