Начнем с определения двух списков ввода, я переименовал их, так как list
является встроенной процедурой в схеме и не является хорошей идеей перезаписать ее):
(define l '(1 2 3 4))
(define l1 '(2 4 6 8))
Япри условии, что вы хотите, чтобы ваш список результатов был «плоским» - например, он не содержит списков элементов, только элементы (если у вас все в порядке с наличием списка списков в l2
, просто удалите вызов flatten ниже).Для этого нам нужно определить процедуру flatten
:
(define (atom? x)
(and (not (pair? x)) (not (null? x))))
(define (flatten lst)
(cond ((null? lst) empty)
((atom? lst) (list lst))
(else (append (flatten (car lst))
(flatten (cdr lst))))))
Наконец, проблема на руку.Проще понять, как вложить две map
процедуры - взгляните на раздел вложенных отображений в книге SICP .
(define l2
(flatten
(map (lambda (i)
(map (lambda (j)
(* i j))
l1))
l)))
На этомточка, l2
содержит ожидаемый ответ:
(2 4 6 8 4 8 12 16 6 12 18 24 8 16 24 32)