2012-11-07 158 views
3

我剛開始用球拍編程,現在我遇到以下問題。 我有一個列表的結構,我必須將列表中的所有價格加起來。結構中的球拍列表

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

問題是,我不知道如何將所有物品價格與此相加。


回答奧斯卡·洛佩斯: 我可能填補空白不正確的,但拍紀念碼黑色當我按下啓動和不返回任何東西。

(define (add-prices items) 
    (if (null? items)   
    0     
     (+ (first items)     
     (add-prices (rest items))))) 
+3

這是功課? (如果是這樣,你應該這樣標記)無論如何,我認爲你應該看看[任意大數據]的章節(http://www.ccs.neu.edu/home/matthias/HtDP2e/請參閱HTDP2e中的part_two.html)以瞭解如何設計在列表上運行的函數。 –

+0

同意。特別是,如何設計程序第2版有一章講述如何編寫處理任意大小列表的函數:http://www.ccs.neu.edu/home/matthias/HtDP2e/part_two.html – dyoo

+0

@Tim你的基本情況是錯誤的 - 只需回答這個問題:空列表的價格是多少?零!只寫'0'。你不能像這樣在列表中添加一個數字:'(+ 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 

(*)請注意,您已經知道怎麼寫這部分,只要使用適當的程序來訪問值獲得的第一個項目的價格列表!

有很多方法可以解決這個問題。我提議的方法是遍歷列表的標準方法,對每個元素進行操作並遞歸合併結果。

+0

非常感謝您的回答。但它似乎不能正常工作。我將編輯主要問題。 – Tim

+0

@ user1806829可能在填充空白方面存在問題,上面的解決方案模板起作用,我對其進行了測試。放在這裏(在評論中)你填寫每個問號的方式 –

1

使用與foldl和地圖:

(foldl + 0 
     (map 
     (lambda (it) 
      (item-price it)) 
      some-items))