2014-04-15 78 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