You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:48:24