我具有该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)))
)
但出现错误:调用“ [F'(1 2 3 4))”时出现“ CAR:1不是列表”。
此外,我不确定是否正确避免了两次递归调用。
得到此错误的原因是,即使实际上(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))))