2013-02-08 67 views
1

您將如何開發一個函數one,它將消耗符號列表並返回相同的列表,但每個實例'cat加倍?列表/複合數據

因此,例如

(one (cons 'animal(cons 'table (cons 'cat (cons 'bread 
    empty))))) 

我會得到回報(我想)

(cons 'animal (cons 'table (cons 'cat (cons 'cat (cons 'bread 
    empty))))) 

。閱讀這本書並試圖弄清楚這件事,我感到沮喪。

+0

使用的邏輯程序是從SRFI1/R6RS'摺疊'或'摺疊'。 – leppie 2013-02-08 19:32:28

+0

BTW:'(cons'animal(cons'table(cons'cat(cons'bread empty))))'簡單寫成''(動物表貓麪包)' – leppie 2013-02-08 19:33:35

+0

@leppie如果你想要使用'set-car!'或'set-cdr!'。 :-P – 2013-02-08 20:03:41

回答

3

這是在構建另一個列表時如何遞歸遍歷列表的最簡單示例之一。你應該自己寫,因爲你正在學習。我會幫你一點與解決方案的總體結構,填補空白:

(define (copy lst) 
    (if <???>     ; is the list empty? 
     <???>     ; if so, return the empty list 
     (cons <???>   ; otherwise `cons` the first element of the list (*) 
      (copy <???>)))) ; and advance the recursion over the rest of the list 

(*)......但如果元素是'cat,然後利弊的副本。

(copy (cons 'one (cons 'animal (cons 'table (cons 'cat (cons 'bread empty)))))) 

...這恰好是相同的::

與列表中的問題測試它

(copy '(one animal table cat bread)) 

無論哪種方式,其結果是輸入列表的副本具有相同的元素(以及每個發現的'cat的兩個副本),但駐留在新的cons-cells中。

2

Leppie(他告訴我「去玩你的流量突變; p」以迴應我上面的set-car!/set-cdr!評論;-))想讓我寫一個基於摺疊的解決方案,所以在這裏!

(define (fun lst) 
    (fold-right (lambda (e r) 
       (case e 
       ((cat) (cons* e e r)) 
       (else (cons e r)))) 
       '() lst))