首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基本LISP递归,枚举值大于3

基本LISP递归,枚举值大于3
EN

Stack Overflow用户
提问于 2010-11-19 06:39:22
回答 3查看 857关注 0票数 4

我需要一个递归LISP函数来枚举任何大于3的数字列表中的元素数量。我不允许使用let、循环或whiles,只能使用基本的CAR、CDR、SETQ、COND、CONS、APPEND、PROGN、LIST...

这是我在函数中的尝试:

代码语言:javascript
运行
复制
(defun foo (lst) 
  (COND ((null lst) lst) 
    (T (IF (> (CAR lst) 3) 
      (1+ (foo (CDR lst)))
      (foo (CDR lst)) ) ) ) )

函数调用:

代码语言:javascript
运行
复制
(foo '(0 1 2 3 4 5 6))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-19 06:44:59

您的代码非常接近正确,只是在基本情况下出现了一个小错误:

对于空列表,您将返回空列表。所以如果你有一个列表(6),你需要在空列表的foo上加上6,这就是空列表。这不起作用,因为您不能将数字添加到列表中。

lst为空时,您可以通过让foo返回0而不是lst来轻松解决这个问题。

作为一个风格说明:像这样混合condif,似乎有点多余。我会这样写它,只使用cond

代码语言:javascript
运行
复制
(defun foo (lst) 
  (cond
    ((null lst)
      0)
    ((> (car lst) 3) 
      (1+ (foo (cdr lst))))
    (T
      (foo (cdr lst)))))
票数 5
EN

Stack Overflow用户

发布于 2010-11-19 06:55:44

一些风格上的要点:

  • 没有必要将一些Lisp内置的代码放在大写字母中。现在已经不是1958年了!,
  • ,但是如果你打算把内置的代码放在大写,为什么不让DEFUNDEFUN在你的cond的最后一个分支中放一个if呢?这是多余的。既然cond的目的是测试条件,为什么不使用它呢?
  • 没有必要像这样把你的闭括号隔开。现在没有人计算圆括号了,我们有了圆括号匹配的editors.
  • Lisp,函数和值有不同的名称空间,所以您不必调用参数lst来避免与内置函数list.

冲突

如果您真的要对此进行编程,您当然会使用count-if

代码语言:javascript
运行
复制
(count-if #'(lambda (x) (> x 3)) '(0 1 2 3 4 5 6))
    ==> 3
票数 5
EN

Stack Overflow用户

发布于 2018-09-11 09:11:17

对于重复的递归调用,您可以节省一个成本:

代码语言:javascript
运行
复制
(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 rest
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4220349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档