list - 返回和的 Lisp 函数

标签 list sum lisp iteration clisp

我正在尝试编写一个奇怪的函数,请耐心等待。此函数应将列表 L 作为参数并具有 sum 变量。如果 L 不是一个列表,它应该返回 nil。否则,它应该遍历列表的每个元素并执行以下操作:

  • 如果元素是一个数字并且小于零,它应该从总和中减去1。
  • 如果元素是一个数字并且大于零,它应该在总和上加1。
  • 如果元素为 0 或不是数字,则应将 0 加到总和上。

这是我的代码,但无论传入的参数如何,它都会返回 0:

(defun sigsum (L)
  (let ((sum 0))                   ;;variable sum
  (if (not (listp L))              ;;if L is not a list
      nil                          ;;return nil
      (dotimes (i (length L))      ;;otherwise loop through L
        (if (numberp (elt L i))    ;;if each element is a number
            (if (< (elt L i) 0)    ;;if is less than 0 subtract 1 from sum
                (- sum 1)
            (if (> (elt L i) 0)    ;;if greater than 0 add 1 to sum
                (+ sum 1))
            (+ sum 0))             ;;else add 0 to sum
          (+ sum 0)))              ;;not a number so add 0 to sum
  )
  sum)                             ;;return sum
)

一如既往,非常感谢任何帮助。

最佳答案

其他答案已经描述了您代码中的问题,但查看解决问题的其他方法可能会有所帮助。这是具有关键函数归约 的一个非常典型的例子(参见reduce)。你可以用(reduce '+ list)来总结list中的元素。但是,您不想只对元素求和,其中一些可能不是数字,您希望将每个元素映射到一个数字(-1、0 或 1),然后将它们相加。这意味着您需要一个关键功能。首先,让我们定义将元素取为 -1、0 或 1 的函数:

(defun to-number (x)
  (cond
    ((and (numberp x) (< x 0)) -1)
    ((and (numberp x) (> x 0)) 1)
    ((or (not (numberp x)) (zerop x)) 0)))

然后你的 sum 函数需要返回 nil 如果它的参数不是一个列表,或者 (reduce '+ … :key 'to-number) 如果它的参数是一个列表:

(defun sum (thing)
  (if (not (listp thing))
      nil
      (reduce '+ thing :key 'to-number)))

从概念上讲,这种方法与应用加法运算符到(mapcar 'to-number list)的结果相同,但是减少 通常是首选,因为调用函数时可以有最大数量的参数,因此 (apply '+ (mapcar …))(mapcar …) 时中断> 返回一个比这更长的列表。另一个问题是 ma​​pcar 会分配一个全新的列表来保存中间值(to-number 的结果),这是一种不必要的空间使用。

关于list - 返回和的 Lisp 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28427312/

相关文章:

python - 将数组的复杂数组转换为列表

list - 如何在 Go 中表示变量嵌套列表

javascript - 获取 ngRepeat 中对象键值的总和

sql - 使用 SQL 计算百分比

lisp - Common Lisp - 名称冲突 我认为包系统应该保护我免受

java - 空列表错误

scala - 如何对元组列表求和

来自 AutoLISP/AutoCAD 宏的 SOAP 请求

clojure - 为什么 TCO 需要 VM 的支持?

python - python中列表的可变性