0

我的问题涉及两个袋子的区别。一个包由包含一个值和该值的基数的对组成。我遇到的问题是检查这对是否有效,并且可以添加到最终列表中。例如,如果我运行以下命令:

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

正确答案应该是((1 5) (3 4) (4 5) (5 4)) 但是我得到了((1 5) (2 -1) (3 4) (4 5) (5 4))。关于如何检查负基数的任何想法。任何帮助,将不胜感激。

(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))))))
4

1 回答 1

1

由于您似乎只想保留 bag1 中基数大于 bag2 中相应对的基数的对,因此您应该使用测试更改 cond 子句

(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)))))
于 2013-08-08T07:45:05.623 回答