防止在 Common Lisp 中重复调用递归函数



我有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))))

最新更新