Scheme嵌套列表奇数原子求和报contract violation错误如何解决?
嵌套列表奇数求和问题修复方案
错误原因
原代码存在两个核心问题导致运行报错且逻辑不符合需求:
- 分支语法错误:cond的最后一个匹配分支缺少
else关键字,匹配到该分支时会错误返回列表类型的(cdr list)而非数值,加法运算收到非数值参数直接触发契约违规报错。 - 嵌套列表处理逻辑缺失:检测到当前首元素为列表时,仅跳过该元素处理剩余列表,没有递归遍历嵌套列表内部的元素,既漏统计了嵌套列表中的奇数,也没有正确处理
()类型的空列表子元素。
修复后代码
(define (sumodd lst) (cond ;; 递归终止条件:空列表求和为0 ((null? lst) 0) ;; 首元素是列表:递归计算子列表奇数和 + 剩余列表奇数和 ((list? (car lst)) (+ (sumodd (car lst)) (sumodd (cdr lst)))) ;; 首元素是奇数:累加首元素 + 剩余列表奇数和 ((odd? (car lst)) (+ (car lst) (sumodd (cdr lst)))) ;; 其余情况(首元素为偶数):直接返回剩余列表奇数和 (else (sumodd (cdr lst))) ))
运行验证
执行测试用例:(sumodd '(1 (2 () 6) 3 (5) 8))
返回结果为9,与预期结果(1+3+5)一致。
内容的提问来源于stack exchange,提问作者berkleybaby
相关产品推荐
相关产品推荐

