Lisp:防止双重调用递归函数

时间:2016-06-13 09:34:54

标签: lisp common-lisp

如何在不使用set / setq / setf的情况下阻止对(f(car l))的双重递归调用?

(defun f(l)
    (cond
        ((null l) nil)
        ((listp (car l)) (append (f (car l)) (f (cdr l)) (car (f (car l)))))
        (T (list (car l)))
    )
)

你认为以下解决了这个问题吗?

(defun f(l)
  (cond
    ((null l) nil)
    ((listp (car l))
        (funcall #'(lambda(ff) (append ff (f (cdr l)) (list (car ff)))) (f (car l))))
    (T (list (car l)))
   )
)

1 个答案:

答案 0 :(得分:4)

您的尝试没问题,但通常写成:

...
(bar (foo abcde))
...
(baz (foo abcde))
...

- >

(let ((r (foo abcde)))
  ...
  (bar r)
  ...
  (baz r)
  ...)

还要注意:

(funcall #'(lambda (foo) ...) bar)

可以用Common Lisp编写为:

((lambda (foo) ...) bar)
如上所述,

或首选:

(let ((foo bar))
  ...)