Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何检查以确保最终列表中只有正值?_List_Scheme_Racket - Fatal编程技术网

List 如何检查以确保最终列表中只有正值?

List 如何检查以确保最终列表中只有正值?,list,scheme,racket,List,Scheme,Racket,我的问题是关于两个袋子的区别。包由包含值和值的基数的对组成。我遇到的问题是检查这一对是否有效,是否可以添加到最终列表中。例如,如果我运行以下命令: (diff '((1 5) (2 2) (3 4) (4 8) (5 4)) '((2 3) (4 3) (6 2))) 正确答案应该是((15)(34)(45)(54)) 但是我得到了((15)(2-1)(34)(45)(54))。关于如何检查负基数的任何想法。任何帮助都将不胜感激 (define (diff bag1 bag2) (cond

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

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

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

由于您似乎只希望保留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 
   (cons (car bag1) (diff (cdr bag1) bag2)))))

我想保留bag1中的元素,它们在bag2中没有相同的值,因为它是bag difference(类似于set difference)。但是,如果bag1和bag2的值相同,那么我想从bag2的基数中减去bag1的基数。这就是为什么我要检查差异的结果是零还是负,并且避免使用car和cdr。相反,adt总是一种更好的可读性方法,这正是我想要的。谢谢你花时间帮我回答我的问题。
(else 
   (cons (car bag1) (diff (cdr bag1) bag2)))))