避免双递归

时间:2014-01-06 23:00:30

标签: recursion lisp

(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)))
))

此函数返回一个虚线对(如果第一个元素是子列表),子列表的第一个元素作为右侧部分,左侧部分是右侧的元素和列表的第二个元素(如果不是sublist)。现在,如何在不使用(F (CAR L))的双递归且不使用SET,SETQ,SETF的情况下重写此内容?

1 个答案:

答案 0 :(得分:1)

使用LET将局部变量绑定到重复的递归调用。

(DEFUN F(L)
   (COND
      ((NULL L) NIL)
      ((LISTP (CAR L))
       (LET ((FCAR (F CAR L)))
         (APPEND FCAR
                 (F (CDR L))
                 (CAR FCAR))))
      (T (LIST (CAR L)))
))