Scheme中如何实现支持不等长列表的map2过程
你只需要调整递归终止条件即可,把原来仅判断items1为空的逻辑,改为任意一个列表为空时就终止递归返回空列表,就能适配两个列表不等长的场景,自动取最短列表的长度生成结果。
修改后的完整代码如下:
(define (map2 proc items1 items2) (if (or (null? items1) (null? items2)) '() (cons (proc (car items1) (car items2)) (map2 proc (cdr items1) (cdr items2)))))
用你给出的示例测试,调用(map2 + '(1 2 3 4) '(3 4 5))即可返回预期结果(4 6 8),执行逻辑如下:
- 第一次递归:两个列表都非空,计算
1+3=4,继续递归处理(2 3 4)和(4 5) - 第二次递归:两个列表都非空,计算
2+4=6,继续递归处理(3 4)和(5) - 第三次递归:两个列表都非空,计算
3+5=8,继续递归处理(4)和() - 第四次递归:
items2为空,直接返回空列表,上层拼接所有计算结果后得到最终输出
注:你示例中写的调用函数名maps2是笔误,实际调用时和定义的map2保持一致即可。
内容的提问来源于stack exchange,提问作者N.A.
相关产品推荐
相关产品推荐

