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

Common Lisp新手求助 如何实现列表相邻元素交替翻转功能

递归实现

递归逻辑直观,适合处理常规长度的列表:

  • 输入列表长度小于2时直接返回原列表
  • 交换前两位元素后,递归处理剩余的后半段列表,再将两部分结果拼接即可
(defun swap-alternate (lst)
  (if (or (null lst) (null (cdr lst)))
      lst
      (cons (cadr lst)
            (cons (car lst)
                  (swap-alternate (cddr lst))))))

测试示例

  • 输入(swap-alternate '(1 2 3 4 5)),输出(2 1 4 3 5)
  • 输入(swap-alternate '(a b c d e f)),输出(b a d c f e)
  • 输入(swap-alternate '(x)),输出(x)
  • 输入(swap-alternate nil),输出nil

迭代实现(适配长列表场景)

如果需要处理长度极大的列表,递归实现可能触发栈溢出,可使用loop宏实现无栈的迭代版本:

(defun swap-alternate-iter (lst)
  (loop for (a b) on lst by #'cddr
        if b
          collect b
          and collect a
        else
          collect a))

该实现每次步进两个元素遍历列表,存在第二个元素时就先插入第二个、再插入第一个,仅剩余单个元素(奇数长度列表的最后一位)时直接插入即可。

内容的提问来源于stack exchange,提问作者soamny12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:06:02