2013-08-08 2 views
0

제 질문은 두 봉지의 차이점을 다루고 있습니다. 가방은 값과 값의 카디널리티를 포함하는 쌍으로 구성됩니다. 문제는 쌍이 유효한지 확인하고 최종 목록에 추가 할 수 있다는 것입니다. 정답은 ((1 5) (3 4) (4 5) (5 4)) 그러나 나는 ((1 5) (2 -1) (3 4) (4 5) (5 4)) 무엇입니까해야최종 목록에 양수 값만 있는지 확인하려면 어떻게합니까?

(diff '((1 5) (2 2) (3 4) (4 8) (5 4)) '((2 3) (4 3) (6 2))) 

예를 들어 나는 다음을 실행합니다. 부정적인 카디널리티를 확인하는 방법에 대한 아이디어. 어떤 도움을 주시면 감사하겠습니다. 당신은 기수가 bag2에 대응하는 한 쌍의 기수보다 큰 여성 가방에서만 쌍을 유지하려는 것 때문에

(define (diff bag1 bag2) 
    (cond 
    ((null? bag1) '()) 
    ((null? bag2) '()) 
    ((eq? (car(car bag1)) (car(car bag2))) 
    (cons 
     (cons (car(car bag1)) 
      (cons (- (car(cdr(car bag1))) (car(cdr(car bag2)))) '())) (diff (cdr bag1) (cdr bag2)))) 
    (else 
    (cond 
     ((member? (car(car bag1)) bag1) (cons (car bag1) (diff (cdr bag1) bag2))))))) 

(define (member? x bag) 
    (cond 
    ((null? bag) #f) 
    (else 
    (or(eq?(car(car bag)) x) (member? x (cdr bag)))))) 

답변

1

, 당신은 테스트

(eq? (car(car bag1)) (car(car bag2))) 

와 콘드 절을 변경해야합니다 두 조항에

((and (eq? (car (car bag1)) (car (car bag2))) 
     (> (car (cdr (car bag1))) (car (cdr (car bag2))))) ;; Difference > 0: substract 
(cons 
    (cons (car(car bag1)) 
     (cons (- (car(cdr(car bag1))) (car(cdr(car bag2)))) '())) 
    (diff (cdr bag1) (cdr bag2)))) 
((eq? (car (car bag1)) (car (car bag2)))   ;; Difference then <= 0: skip 
(diff (cdr bag1) (cdr bag2))) 

추가 개선이 가능합니다. 예 :

(else 
(cond 
    ((member? (car(car bag1)) bag1) (cons (car bag1) (diff (cdr bag1) bag2))))))) 

(else 
    (cons (car bag1) (diff (cdr bag1) bag2))))) 
+0

잘 나는 그것이 (차이를 설정 유사) 가방 차이가 있기 때문에 bag2에 같은 값이없는 여성 가방의 요소를 유지하려면 단순화 할 수있다. 그러나 bag1과 bag2의 값이 같으면 bag2의 카디널리티에서 bag1의 카디널리티를 뺍니다. 그래서 차이의 결과가 0인지 음수인지 확인하려고합니다. – user2659117

+0

을 사용하고 car 및 cdr을 사용하지 마십시오. 대신, adt는 항상 읽을 수있는 더 좋은 방법입니다. – Asqan

+0

@ user2659117 업데이트 된 답변을 확인하십시오. –

관련 문제