2017-02-15 37 views
0

Как добавить круглые скобки в список? Например,Как добавить() в список?

(умножить '(1 2)' (1 2 3))

Это должен вывести ((1 2 3) (2 4 6))

Это то, что у меня сейчас

(define multiply 
    (lambda (los1 los2) 
    (cond 
    ((null? los1) '()) 
    ((null? los2) '()) 
    (else (cons (* (car los1) (car los2)) 
     (append (multiply(list (car los1)) (cdr los2)) 
      (multiply(cdr los1) los2))))))) 

Выход, который я получаю (1 2 3 2 4 6).

P/S: Если это плохой вопрос или что-то еще, не стесняйтесь говорить мне или ругать меня. Я пытаюсь научиться использовать stackoverflow.

ответ

1

Подумайте, каковы последствия ввода и вывода. Я предполагаю, что вы не можете сделать это с помощью одной рекурсивной процедуры, но вы можете сделать это с двумя.

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