Racket不使用递归如何通过filter或fold遍历嵌套列表完成过滤
问题原因
你现有代码的逻辑仅检查了顶层元素和子列表的第一个元素,未处理子列表的剩余元素以及深层嵌套的子列表,因此只能匹配到2、4、8三个偶数,和错误输出一致,漏掉了子列表中的4、10两个偶数。
解决方案
作业要求不允许自行实现递归,可以直接调用Racket标准库内置的flatten函数,该函数会自动将任意深度的嵌套列表展开为仅包含原子元素的一维列表,无需自己编写递归逻辑,符合要求。
修改后的实现代码如下:
(define (count-evens lst) (length (filter (lambda (x) (and (number? x) (even? x))) (flatten lst))))
结果验证
运行测试用例:(count-evens '(1 2 5 4 (8 4 (b (10 3 3))) 3))
输出结果为5,符合预期。
内容的提问来源于stack exchange,提问作者Angxl
相关产品推荐
相关产品推荐

