我有Lisp函数:
(defun F(l)
(cond
((atom l) -1)
((>(F(car l))0)(+(car l)(F(car l))(F(cdr l))))
(t(F(cdr l)))
)
)
我想防止使用 lambda 函数在 cond 的第二行中双重调用递归函数(F (car l))
。
我试过了:
(defun F(l)
((LAMBDA (ff)
(cond
((atom l) -1)
((> ff 0)(+(car l) ff (F(cdr l))))
(t(F(cdr l)))
)
) (F (car l)))
)
但我得到错误:
汽车:1 不是列表
在呼叫(F '(1 2 3 4))
.
我也不确定这是否正确避免了双重递归调用。
您收到此错误的原因是您总是在调用(car l)
,即使l
实际上不是list
。
为避免这种情况,请仅在需要时执行此操作:
(defun F(l)
(if (atom l) -1
(let* ((l1 (car l))
(f1 (F l1))
(f2 (F (cdr l))))
(if (plusp f1)
(+ l1 f1 f2)
f2))))