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

Scheme嵌套列表递归反转报错及反转不彻底问题求助

Scheme递归反转列表问题排查

问题根因

  • 第一版子列表未反转:仅对顶层列表做反转操作,处理列表首元素(car lst)时未判断其是否为子列表,没有对子列表递归调用反转逻辑,直接原样拼接进结果。
  • 第二版运行报错有两个诱因:
    1. 命名不匹配:测试要求传入名为invert的过程,第二版定义的过程名是inverse,本身不符合测试调用要求
    2. 边界判断顺序错误:测试用例第一个入参是原子值'a(非列表、非空表),第二版的条件分支仅先判断空表,随后直接对入参调用(car ls),对非序对(pair)的原子值调用car就会触发expected: pair?的合约报错。第一版虽然写了非列表值的判断,但位置靠后,且未对首元素做递归反转处理。

修复后的正确实现

逻辑顺序调整为优先处理非列表原子值,再处理空表,最后处理普通列表场景,处理列表时同时对cdr和car递归调用反转过程,保证所有层级子列表都被反转:

#lang scheme

(require "project3test.scm") 

(define (invert lst)
  (cond
    ;; 非列表的原子值直接返回,兼容传入'a'这类测试用例
    ((not (list? lst)) lst)
    ;; 空表基准情况
    ((null? lst) '())
    ;; 递归反转剩余部分,再把递归反转后的首元素拼到结果末尾
    (else (append (invert (cdr lst))
                  (list (invert (car lst)))))))

(test-invert invert)

运行预期输出

"Question 5: invert"
a
(3 2 1)
(9 (((8) 7 6) 5) (4 3) 2 1)

完全满足所有测试用例要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:48:28