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

问题描述 投票:0回答:1

我具有该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不是列表”。

此外,我不确定是否正确避免了两次递归调用。

recursion lisp common-lisp
1个回答
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))))
© www.soinside.com 2019 - 2024. All rights reserved.