Сопоставление двух списков с неравномерной длиной — Схема

#list #mapping #scheme

Вопрос:

Я реализую процедуру «map2», которая принимает два списка и возвращает сумму каждого элемента. Если списки неравномерны, возвращаются только суммы самого короткого списка. Мой код таков:

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

Примером использования должно быть:

(карты 2 ‘(1 2 3 4) ‘(3 4 5)) —> (4 6 8)

Мой вопрос в том, как реализовать часть, которая обрабатывает неравномерные списки?

Ответ №1:

Ваше решение почти правильное — вам просто нужно проверить оба списка и остановиться, когда один из них пуст.

 (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)