Scheme嵌套列表递归反转报错及反转不彻底问题求助
Scheme递归反转列表问题排查
问题根因
- 第一版子列表未反转:仅对顶层列表做反转操作,处理列表首元素
(car lst)时未判断其是否为子列表,没有对子列表递归调用反转逻辑,直接原样拼接进结果。 - 第二版运行报错有两个诱因:
- 命名不匹配:测试要求传入名为
invert的过程,第二版定义的过程名是inverse,本身不符合测试调用要求 - 边界判断顺序错误:测试用例第一个入参是原子值
'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
相关产品推荐
相关产品推荐

