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

如何编写Scheme过程实现列表相邻元素交换并修复cddr报错问题

错误原因分析

  • 括号配对错误:你写的cond表达式括号位置完全错误,递归调用(newlist (cddr givenList))没有被包含在cond的分支逻辑中,无论前面的条件判断结果如何,最后都会强行执行这行递归代码。当列表最后只剩1个元素(比如你示例里的最后一个g)时,cddr givenList会尝试对长度为1的列表取后两位,直接触发类型不匹配的报错。
  • 分支逻辑错误:cond的第三个分支没有加else关键字,你写的(list (cadr givenList) (car givenList))会被cond识别为「判断条件为list,执行(cadr givenList)和(car givenList)」,而list是内置函数,布尔值为真,所以只要列表长度大于等于2,永远会走这个无效分支。
  • 拼接逻辑缺失:你没有把当前位置交换后的两个元素和后续递归得到的结果拼接,就算括号修正也无法返回完整的结果列表。

修正后代码(匹配你描述的「交换列表连续相邻元素」需求)

(define (newlist givenList)
  (cond
    ; 空列表直接返回空
    ((null? givenList) '())
    ; 只剩1个元素,直接返回该元素组成的列表
    ((null? (cdr givenList)) (list (car givenList)))
    ; 否则交换前两个元素,拼接上后续递归交换的结果
    (else (cons (cadr givenList)
                (cons (car givenList)
                      (newlist (cddr givenList)))))))

如果你的需求还包含「如果元素本身是长度为2的子列表,也交换子列表内部元素」,可以调整else分支的逻辑,增加子元素的判断和交换处理即可。

测试验证

调用(newlist '((a b) (c d) e f g))会返回'((c d) (a b) f e g),符合「顶层相邻元素两两交换」的需求。如果你示例中的预期输出是写错了输入,实际输入为(newlist '(a b c d e f g)),则返回结果为'(b a d c f e g),和你给出的预期输出逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:39:02