映射两个长度不均匀的列表 - 方案

Mapping over two lists with uneven lengths - Scheme

我正在实施一个过程 'map2',它接受两个列表和 returns 每个元素的总和。如果列表不均匀,则只返回最短列表的总和。我的代码是:

(define (map2 proc items1 items2)
  (if (null? items1)
    '()
    (cons (proc (car items1) (car items2))
          (map2 proc (cdr items1) (cdr items2)))))

使用示例应该是:

(maps2 + '(1 2 3 4) '(3 4 5)) --> (4 6 8)

我的问题是如何实现处理不均匀列表的部分?

您的解决方案几乎是正确的 - 您只需检查两个列表并在其中一个为空时停止。

(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)
> (map2 * '(1 2) '(3 4 5))
'(3 8)