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
相关产品推荐
相关产品推荐

