2010-11-09 58 views
2

我需要编写一个递归函数来打印列表中的元素两次。例如,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)?我做错了什么,我该如何解决它?

+1

当你说,“打印”,你的意思是“回归”?如果这是作业,你应该添加“家庭作业”标签。 – 2010-11-09 23:22:32

+0

是的,我的意思是返回...对不起,关于标签,它是我第一次在论坛上... – 2010-11-09 23:37:55

+0

没问题。欢迎来到堆栈溢出! – 2010-11-09 23:40:35

回答

0

的原因,它是导致您遇到的问题是,鉴于((1 2) 3)代码递归进入(1 2),它正确地成为(1 1 2 2)然后添加(1 2)(即在第一次调用car)的(1 1 2 2)后给予((1 1 2 2) (1 2) ...)

什么是最好就是让rdouble总是返回一个列表,并append这些名单在一起,而不是cons荷兰国际集团他们

4

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

  1. 原子 - >用原子作为CAR返回它
  2. 一个缺点 - >与一个缺点为CAR一倍
  3. 一个缺点 - >步行下来

你的代码处理只有两种情况下,如果你的第二个情况下,混合2和3

+0

解释它的好方法 – tobyodavies 2010-11-10 00:14:16