交换对与追加在Racket

时间:2014-04-15 11:06:03

标签: scheme racket

我有这个想法,我只是有点卡在执行上。我需要做的是交换每两对列表。例如(1 2 3 4 5 6)变为(2 1 4 3 6 5)

我已经交换了前两对工作,我计划做的是交换前两个,然后是下一个,等等,然后附加它。我不知道怎么回事。感谢任何帮助,这是我的代码到目前为止。我知道可能需要在那里进行递归,但是如何将对设置为变量以便我可以稍后追加或者已经附加了?

(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))))

1 个答案:

答案 0 :(得分: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)

交换