2017-09-28 8 views
1

두 개의 목록을 인수로 취해 입력 목록을 결합하여 주어진 목록의 요소가 결합 된 쌍의 목록을 반환하는 함수를 작성해야합니다.Racket : 2 목록에서 재귀 목록 작성

예 입력 :

(zipper '(1 2 3) '(4 9 5 7)) 

예 출력 : 하나 개의 입력 목록은 더 이상

'((1 4) (2 9) (3 5)) 

경우 긴 목록의 다른 추가 요소는 무시됩니다보다. 구현은 재귀 적이어야합니다.

코드는 내가 만든 :

(define (zipper list1 list2) 
(if (or (empty? list1) (empty? list2)) 
    '() 
(list (list (zipper (rest list1) (rest list2)))))) 

출력 :

'((((((((())))))))) 
'((((((())))))) 
'() 

누군가가 도와 주실 수 있습니까? 나는 또한 요소를 모으기 위해 '단점'을 사용해 보았습니다. 그래서 요소가 어떻게 사라지는 지 잘 모르겠습니다. 나는 라켓 신품입니다. 감사.

+0

테스트 사례에서 나온 bc는 어디에 있습니까? 더 많은 테스트 케이스를 제공하십시오. 주어진 정보와 함께 할 수는 있지만 확신 할 수는 없습니다. (한 쌍의 목록은 무엇입니까? 출력 결과와 다릅니다.) 쌍의 목록을 의미합니까? –

+0

당신은 절대적으로 옳습니다. 잘못된 테스트 케이스를 내 게시물에 복사했습니다. 편집 됨. –

답변

2

우리가해야 할 일은 목록이 비어있는 경우 기본 사례로 빈을 반환하는 함수를 만드는 것입니다. 그렇지 않으면 우리는 (첫 번째 list1, 첫 번째 list2)를 재귀 호출로 간주합니다.

(define (zipper list1 list2) 
    (cond [(or (empty? list1) 
      (empty? list2)) empty] 
     [else (cons 
       (cons (first list1) 
        (first list2)) ;; List of first elements 
       (zipper (rest list1) (rest list2)))])) 
+1

글쎄. 도움을 주셔서 감사합니다, 정말 고마워요. 게시 한 코드에서 (1. a) 등의 출력을 얻었으므로 else 블록의 두 번째 'cons'명령을 'list'로 조정하여 수정했습니다. –

+3

@BrianJay 또한'(지도 목록 list1 list2)'도 마찬가지입니다. srfi-1'map'은 가장 짧은 목록에서 멈 춥니 다. – Sylwester