Scheme 我在Dr Racket中写的代码,但我不知道´;我不知道为什么,但我的最后一次测试不起作用。有人知道为什么吗?

Scheme 我在Dr Racket中写的代码,但我不知道´;我不知道为什么,但我的最后一次测试不起作用。有人知道为什么吗?,scheme,racket,Scheme,Racket,我在Dr Racket中写下了这段代码,我必须评估所有物品,目的是选择哪一个更适合购买。现在我想我可能被捉住了,但是现在我对最后一个测试有一个问题,代码最后一行中的测试。不知何故,这不是接线,任何人都可能知道我的代码出了什么问题。也许我太投入了,但我找不到我的错误 要得到一个答案,我真的很感激 (define-struct item (name volume yield typical)) ;; volume of a standard european container in m^

我在Dr Racket中写下了这段代码,我必须评估所有物品,目的是选择哪一个更适合购买。现在我想我可能被捉住了,但是现在我对最后一个测试有一个问题,代码最后一行中的测试。不知何故,这不是接线,任何人都可能知道我的代码出了什么问题。也许我太投入了,但我找不到我的错误

要得到一个答案,我真的很感激

    (define-struct item (name volume yield typical))

;; volume of a standard european container in m^3
(define container-volume 78.6)

;; sample items
(define strong-beer (make-item "Strong Beer" 15 8372 7))
(define cheap-beer (make-item "Cheap Beer" 21 4562 2))
(define good-beer (make-item "Good Beer" 7 5113 9))
(define pretzels (make-item "German Style Pretzels" 7 9280 5))
(define weisswurst (make-item "Weisswurst" 8 7254 10))
(define sweet-mustard (make-item "Sweet Mustard" 1 265 6))
(define haxen (make-item "Haxen" 11 3500 7))
(define sauerkraut (make-item "Sauerkraut" 7 4012 3))
(define bavarian-leberkaes (make-item "Bavarian Leberkaes" 6 1952 6))
(define schnitzel (make-item "Schnitzel" 16 8068 2))
(define obatzda (make-item "Obatzda" 3 3025 8))
(define dumplings (make-item "Dumplings" 8 1234 3))
(define dirndl (make-item "Dirndl" 12 8069 9))

;; all items
(define all-stuff
  (list strong-beer cheap-beer good-beer pretzels weisswurst sweet-mustard
        haxen sauerkraut bavarian-leberkaes schnitzel obatzda dumplings dirndl))


;;Code:
(define (evaluate-item-sum item)
  (foldr (lambda (item sum) (+ (item-volume item) sum)) 0 item)
  )

;;Test:
(check-expect (evaluate-item-sum all-stuff) 122)
(check-expect (evaluate-item-sum (list haxen dirndl)) 23)

;;===============================================================================


;;Code:
(define (choose-items items container-volume)
  (cond
    ((empty? items) empty)
    ((cons? items)
     (local (
             (define first-volume (item-volume (first items))))
             (if (> first-volume container-volume)
             (choose-items (rest items) container-volume)
             (local (
                     (define choice1 (choose-items (rest items) container-volume))
                     (define choice2
                       (cons (first items)
                             (choose-items (rest items) (- container-volume first-volume)))))
               (if (> (evaluate-item-sum choice1) (evaluate-item-sum choice2))
                   choice1
                   choice2)))))))



;; Tests
(check-expect (choose-items all-stuff 50) (list haxen dirndl))

您在调用
选择项目时使用了值50,但我想应该是23。然后,还有第二个适合的组合(StrongBeer GoodBeer芥末),因此要获得想要的结果,您必须将Haxen和Dirndl移动到列表的最前面
所有内容
,以便首先找到它们。使用修改后的列表和值23,最后一次测试通过:

(define all-stuff
  (list haxen dirndl strong-beer cheap-beer good-beer pretzels weisswurst sweet-mustard
         sauerkraut bavarian-leberkaes schnitzel obatzda dumplings ))


您需要解释
选择项目
应该做什么。它似乎并没有被记录在任何地方。它使用一个项目列表,以最适合我们的组合。定义“最佳”。如果没有正确行为的定义,很难看出代码中是否有bug。:-)现在发现了我的问题并解决了。
(check-expect (choose-items all-stuff 23) (list haxen dirndl))