如何用cons、first、rest实现Racket列表首元素与第三元素交换?
交换列表第一个和第三个元素的Racket实现
你已经找到了获取第三个元素的方法,但问题在于只拿到单个元素还不够——我们需要把各个部分按新的顺序用cons拼接起来,才能得到完整的目标列表。
下面是符合要求的实现,只用cons、first、rest这些基础操作:
(define swap-first-third (lambda (lst) ; 先把需要的元素都提取出来,让逻辑更清晰 (let ([first-elem (first lst)] ; 原列表第一个元素 [second-elem (first (rest lst))] ; 原列表第二个元素 [third-elem (first (rest (rest lst)))] ; 原列表第三个元素 [remaining-elems (rest (rest (rest lst)))]) ; 原列表去掉前三个后的剩余部分 ; 按新顺序拼接:第三个元素 → 第二个元素 → 第一个元素 → 剩余部分 (cons third-elem (cons second-elem (cons first-elem remaining-elems))))))
测试一下你给出的例子:
(swap-first-third '(1 2 3))返回(3 2 1)(swap-first-third '(1 2 3 4))返回(3 2 1 4)(swap-first-third '((1 2) (3) (4)))返回((4) (3) (1 2))
原理很简单:我们先拆分原列表的各个部分,再用cons按目标顺序重新组装——cons每次只能把一个元素加到列表头部,所以我们从最内层的剩余部分开始,依次把第一个元素、第二个元素、第三个元素拼上去,最终得到完整的新列表。
注意:这个实现假设输入的列表至少有3个元素,如果输入列表长度小于3,调用first或者rest时会触发错误。如果需要处理短列表的情况,可以额外加判断逻辑,但根据你的需求例子,暂时不需要这部分。
内容的提问来源于stack exchange,提问作者Seeist
相关产品推荐
相关产品推荐

