Подумайте, каковы последствия ввода и вывода. Я предполагаю, что вы не можете сделать это с помощью одной рекурсивной процедуры, но вы можете сделать это с двумя.
(list-multiply 5 '(1 2 3))
; ==> (5 10 15)
Если у вас есть, что вы итерацию по первому списку и использовать list-multiply
для каждого элемента и, конечно, второй аргумент никогда не итерацию, он только что прошел вперед.
(multiply '(1 2) '(1 2 3))
; ==> (cons (list-multiply 1 '(1 2 3))
; (cons (list-multiply 2 '(1 2 3))
; '()))
; ==> ((1 2 3) (2 4 6))
Вы можете осуществить это просто useinfg функции высшего порядка:
(define (multiply lst1 lst2)
(map (lambda (e1)
(map (lambda (e2) (* e1 e2)) lst2))
lst1))
Обратите внимание на двойной map
. Тот, который выполняет итерацию lst1
, чтобы сделать элементы в результате, и второй map
, который умножает один элемент на каждый элемент списка. Вы можете себе представить, что, поскольку они выглядят одинаково, у двух рекурсивных функций, вероятно, тоже много общего.
PS: Научитесь решать свои проблемы без list
и append
. (list 1 2 3)
- это всего лишь процедура, эквивалентная (cons 1 (cons 2 (cons 3 '())))
и (append '(1 2 3) '(4 5 6))
эквивалентна (cons 1 (cons 2 (cons 3 '(4 5 6))))
. Старайтесь всегда создавать списки от конца до начала и в случае, если вам нужно обратное, в конце концов может понадобиться только reverse
.