Racket(Intermediate Student with lambda)无递归实现列表扁平化求助
实现无递归的嵌套列表扁平化函数
核心思路是利用内置的foldr高阶函数替代递归和append的功能:
- 遍历原列表的每个元素,判断其是原子值还是子列表
- 若为原子值,直接用
cons将其加入累积结果 - 若为子列表,用
foldr cons将该子列表的所有元素合并到累积结果中(这一步等价于append的效果,但完全依赖内置foldr,未手动编写递归)
符合要求的代码:
(define (flatten lol) (foldr (lambda (x acc) (if (list? x) (foldr cons acc x) (cons x acc))) '() lol))
验证示例:
- 输入
'(1 (2 3) ((4)) 5),输出'(1 2 3 4 5)
解释:外层foldr负责遍历原列表的顶层元素,内层foldr仅在遇到子列表时触发,用于展开子列表并合并到最终结果中。全程未手动实现递归,也未使用被禁止的append或apply。
内容的提问来源于stack exchange,提问作者glass
相关产品推荐
相关产品推荐

