【发布时间】:2019-04-01 14:59:40
【问题描述】:
这是一个任务:给定一个列表,其中一些元素也是列表。如果所有嵌套列表都是偶数,则需要使用recursion将嵌套列表替换为其中的数字之和。例如:
(1 2 NIL (2 4 6) 5 7) -> (1 2 NIL 12 5 7)
如果父列表匹配转换后的条件:
(2 2 (4 4) (2 2)) -> (2 2 8 4) -> 16
现在我有以下代码:
;; check for all list elements are even
(defun is-even-list (lst)
(cond ((null lst) t)
((and (numberp (car lst)) (evenp (car lst))) (is-even-list (cdr lst)))
(t nil)
)
)
;; list summing
(defun sum-list (lst)
(cond ((null lst) 0)
(t (+ (car lst) (sum-list (cdr lst))))
)
)
;; main func
(defun task (lst)
(cond ((null lst) nil)
((atom (car lst)) (cons (car lst) (task (cdr lst))))
((is-even-list (car lst)) (cons (list (sum-list (car lst))) (task (cdr lst))))
(t (cons (task (car lst)) (task (cdr lst))))
)
)
但现在它只处理列表的“最低”级别(如果存在):
(2 4) -> (2 4)
(2 (2 4 6) 6) -> (2 12 6)
(2 (4 (6 8) 10) 12) -> (2 (4 14 10) 12)
(2 (4 6) (8 10) 12) -> (2 10 18 12)
如何更改此代码以获得“完整”处理?
【问题讨论】:
-
不,按照逻辑上的规范,它应该是
(2 2 (4 4) (2 2)) -> (2 2 8 4) -> 16。你有它的方式,它保证在处理后 not 匹配条件:(8)不是偶数。它甚至不是一个数字。 -
对不起,我用括号指向求和结果,并不是说结果必须是单元素列表。我删除了它们。
-
好的,仍然必须是
(2 2 (4 4) (2 2)) -> (2 2 8 4) -> 16,而不是(16)。
标签: list recursion functional-programming lisp