我刚开始用Racket编程,现在我遇到了以下问题。 我有一个带有列表的结构,我必须在列表中添加所有价格。
(define-struct item (name category price))
(define some-items
(list
(make-item "Book1" 'Book 40.97)
(make-item "Book2" 'Book 5.99)
(make-item "Book3" 'Book 20.60)
(make-item "Item" 'KitchenAccessory 2669.90)))
我知道我可以使用:(item-price (first some-items))
或(item-price (car some-items))
返回价格。
问题是,我不知道如何用这个来加起所有物品的价格。
回答ÓscarLópez: 我可能没有正确地填充空白,但是当我按下开始并且不返回任何内容时,Racket将代码标记为黑色。
(define (add-prices items)
(if (null? items)
0
(+ (first items)
(add-prices (rest items)))))
答案 0 :(得分:2)
简答:使用递归遍历列表。这看起来像家庭作业,所以我会给你一些提示;填空:
(define (add-prices items)
(if (null? items) ; if the list of items is empty
<???> ; what's the price of an empty list?
(+ <???> ; else add the price of the first item (*)
(add-prices <???>)))) ; with the prices of the rest of the list
(*)请注意,已经知道如何编写此部件,只需使用适当的访问该值的程序获取列表中第一项的价格!
有很多方法可以解决这个问题。我建议的那个是遍历列表,操作每个元素并递归组合结果的标准方法。
答案 1 :(得分:1)
使用foldl和map:
(foldl + 0
(map
(lambda (it)
(item-price it))
some-items))