2010-11-09 78 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