如何在谓词中获取非布尔值?递归清除非零元素遇cond报错
问题分析与解决
你的错误根源在于cond表达式没有覆盖所有可能的情况:当遇到非零元素时,cond里没有对应的分支,导致解释器抛出cond: all question results were false错误。另外,你的代码还缺少递归的终止条件(处理空列表的情况),否则递归会无限执行下去。
修正后的完整代码
(define (keep-zeros lst) (cond [(empty? lst) '()] ; 递归终止:空列表返回空 [(zero? (first lst)) (cons (first lst) (keep-zeros (rest lst)))] ; 元素为零,保留并递归处理剩余列表 [else (keep-zeros (rest lst))])) ; 元素非零,直接递归处理剩余列表
代码说明
- 终止条件:
(empty? lst)判断列表是否为空,空列表直接返回空,这是递归必须的边界条件,防止无限递归。 - 零元素处理:当第一个元素是零时,用
cons把它加入结果,再递归处理列表的剩余部分。 - 非零元素处理:
else分支覆盖了所有非零的情况,直接跳过当前元素,递归处理剩余列表,这样cond就不会出现无匹配分支的错误。
测试示例
调用(keep-zeros '(3 0 5 0 7))会返回(0 0),符合你保留所有零元素的需求。
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

