2014-04-15 79 views
0

我有這個想法,我只是有點卡在執行。我需要做的是交換每兩對清單。例如(1 2 3 4 5 6)變成(2 1 4 3 6 5)用球拍交換球對

我已經交換了前2對工作,而我打算做的是交換前2個,然後是下2個等等,然後附加它。我不知道如何去做這件事。任何幫助表示讚賞,這是我的代碼到目前爲止。我知道那裏可能需要遞歸,但是如何將這些對設置爲一個變量,以便我可以稍後追加,或者追加已經這樣做?

(define (swapPairs L) 
    (cond ((null? L) 
      '()) 
     (cons (cadr L) (cons (car L) (cddr L)))) 

(define (appendTo L x) 
    (if (null? L) 
      (cons x L) 
     (cons (car L) (appendTo (cdr L) x)))) 

回答

3

如果列表爲空,而且cdr也爲空,則不能檢查。而不是僅僅使用cddr,您應該將該列表與交換的對進行比較。 IE瀏覽器。遞歸:

(define (swap-every-2 lst) 
    (if (or (null? lst) 
      (null? (cdr lst))) 
     lst 
     (list* (cadr lst) 
      (car lst) 
      (swap-every-2 (cddr lst))))) 

(swap-every-2 '())    ; ==>() 
(swap-every-2 '(a))    ; ==> (a) 
(swap-every-2 '(a 1 b 2 c 3)) ; ==> (1 a 2 b 3 c) 
(swap-every-2 '(a 1 b 2 c 3 d)) ; ==> (1 a 2 b 3 c d) 

在這種情況下使用pairs對我來說有點奇怪,因爲我想的關聯列表。例如。 ((a . 1) (b . 2) (c . 3))它可以與(map (lambda (x) (cons (cdr x) (car x))) lst)

+0

交換謝謝,這解釋了它!讚賞清楚詳細的答案:) – user2318083