我有这个想法,我只是有点卡在执行上。我需要做的是交换每两对列表。例如(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))))
答案 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)