【发布时间】:2014-11-30 11:17:42
【问题描述】:
我猜这应该是用 LISP 很容易完成的事情(他们这样称呼它是有原因的),但我无法完全理解它。
假设我有以下列表:
((1 2 3) (4 (5 6)))
我想把它们都加起来,所以结果应该是 21
我一开始很轻松,尝试从一个不错的列表中添加元素(例如 (1 2 3) ),我几乎做到了:
(defun sum (list)
(if list
(+ (car list) (sum (cdr list)))
0)
)
可能有更好的编码方式和更好的排列方式,但现在这种(几乎类似于 C 的)缩进样式可以帮助我跟踪括号。它有效。
不幸的是,这对于我的示例中的列表来说还不够好。于是我又试了一次:
(defun sum (list)
(cond
( (atom (car list)) (+ (car list) (sum (cdr list))) )
( (list (car list)) (+ (sum (car list) ) (sum (cdr list))))
)
)
这不仅看起来像是矫枉过正,而且是矫枉过正,因为即使对于简单的示例,我也会遇到堆栈溢出错误。
编辑: 我设法编写了一个工作(而不是那么复杂)的函数:
(defun sum (l)
(cond
((null l) 0)
((atom (car l)) (+ (car l) (sum (cdr l))))
((+ (sum (car l)) (sum (cdr l))))
)
)
【问题讨论】:
-
这是一个关于如何reduce对树元素的加法函数的问题。我链接到的副本询问如何在树上减少函数并使用加法作为具体示例。
-
@Joshua Taylor 关闭,但我有兴趣在不展平列表的情况下执行此操作(在尝试做其他一些事情时我设法很容易地进行展平)。有趣的链接和例子:)
-