Lisp:防止递归函数的双重调用
Lisp: Prevent double invocation of recursive function
如何在不使用 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)))
)
)
你的尝试没问题,但通常写成:
...
(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))
...)
如何在不使用 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)))
)
)
你的尝试没问题,但通常写成:
...
(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))
...)