2016-10-13 2 views
-1
(define (long a b) 
(cond ((null? a) '()) 
     ((null? b) '()) 
     (else 
(if (equal? (car a) (car b)) 
    (cons a (long (cdr a) (cdr b))) 
    (cons b (long (cdr a) (cdr b))))))) 

이 함수는 2 개의 목록 사이에서 가장 긴 공통 접두어를 찾는 것으로 가정합니다. 그래서 '(1 2)와'(1 2 3)을 입력하면 나는 얻어야합니다. '(1 2). 그러나, 나는 (long '(1 2)'(1 2 3))을 실행할 때 ((1 2) (2))를 얻는다. 코드를 통해 단계를 되돌아 보았을 때 문제가없는 것 같습니다. 누군가가 문제를 찾도록 도와 줄 수 있습니까?일반적인 접두사 목록 함수의 문제점

감사합니다.

답변

0

간단한 해결책은 다음

목록 프리픽스를 종료
(define (long a b) 
    (cond ((null? a) '()) 
     ((null? b) '()) 
     ((equal? (car a) (car b)) (cons (car a) (long (cdr a) (cdr b)))) 
     (else '()))) 

는 빈리스트이고; car 두 개가 같은 경우 결과는 자동차와 목록의 가장 긴 접두사 인 cdr의 목록입니다. 그렇지 않으면 첫 번째 요소의 목록이 달라 결과가 빈 목록이됩니다.

0

하나 여기에 조건 '에 대한/목록'루프 사용할 수 있습니다

(define (long a b) 
    (for/list ((i a) 
      (j b) 
      #:break (not(= i j))) 
    i)) 

(long '(1 2 3) '(1 2)) 

출력 :

'(1 2)