如何在Scheme(Racket)中无递归使用map处理列表的列表
非递归实现Scheme(Racket)中嵌套列表的map功能
你需要实现对嵌套列表(列表的列表)中的每个原子元素应用指定函数,同时保留列表结构。既然已经掌握递归实现,这里给出完全依赖内置map的非递归方案:
非递归实现代码
(define (map-lists f A) (map (lambda (x) (cond [(pair? x) (map f x)] [(null? x) x] [else (f x)])) A))
逻辑说明
- 外层
map负责遍历输入列表A的每一个元素 - 对于每个元素
x:- 如果
x是子列表(通过pair?判断),就用内层map对这个子列表的所有元素应用函数f - 如果
x是空列表,直接保留原结构 - 如果
x是原子元素,直接对其应用函数f
- 如果
测试验证
调用示例:
(map-lists add1 '((3 1) (2 8)))
输出结果:
'((4 2) (3 9))
这个方案完全利用Racket内置的map替代手动递归,逻辑和你提供的递归版本完全一致,同时满足非递归的要求。
内容的提问来源于stack exchange,提问作者cfrost6
相关产品推荐
相关产品推荐

