如何以递归方式两次打印列表元素?

时间:2010-11-09 23:03:44

标签: recursion lisp

我需要编写一个递归函数,它会打印两次列表的元素。例如,rdouble'(1 2 3)将打印(1 1 2 2 3 3)并且rdouble'(1(2 3)4)将打印(1 1(2 2 3 3)4 4)。

到目前为止,我有:

(defun rdouble(struct)
 (cond
     ((atom struct) struct)
     (t (cons (rdouble (car struct)) (cons (car struct) 
              (rdouble (cdr struct))
        )))))

这适用于第一个示例,但打印

(1 1 (2 2 3 3) (2 3) 4 4)

表示第二个例子。如何继续打印每个元素两次但不重新打印(2 3)?我做错了什么,我该如何解决?

2 个答案:

答案 0 :(得分:4)

该表达式有三种不同的情况:

  1. 原子 - >回来吧
  2. 具有原子作为CAR的缺点 - >加倍
  3. 作为CAR的缺点的缺点 - >走下来
  4. 您的代码只处理两种情况,其中第二种情况混合2和3。

答案 1 :(得分:0)

导致您遇到问题的原因是,在((1 2) 3) {}}}的情况下,您的代码会递归到(1 2),而(1 1 2 2)正确变为(1 2) 然后添加{在car给出(1 1 2 2)之后{1}}(在第一次通话中成为((1 1 2 2) (1 2) ...)

最好的方法是让rdouble 始终返回一个列表,并append将这些列表放在一起而不是cons