2017-02-15 1 views
0

목록에 괄호를 어떻게 추가 할 수 있습니까? 예를 들어,목록에()를 어떻게 추가 할 수 있습니까?

(곱셈 '(12)'(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입니다. 이 두 함수가 유사하기 때문에 두 재귀 함수가 공통점이 많을 수도 있습니다.

추 신 : listappend없이 문제를 해결하는 방법을 배우십시오. (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이 필요합니다.

관련 문제