0

どうしても解決できない問題があり、

ユーザーがリストを入力します。

 (total-cost 
   '((anItem 2 0.01) 
     (item 3 0.10) 
     (anotherItem 4 4.10) 
     (item 5 2.51))) 

最後に数字を足して結果を返す必要があります

私の現在のコードは、追加するたびにコードを返します。また、予期しないタイプに関するエラーをスローします

(defun total-cost (list)
  (loop with sum = 0
        for x in list
      collect (setf sum (+ sum (last x)))
   )
)

エラー: (0.01)' is not of the expected typeNUMBER'

どんな助けでも大歓迎ですありがとうデール

4

5 に答える 5

10

使用LOOP:

CL-USER 19 > (loop for (nil nil number) in '((anItem      2 0.01) 
                                             (item        3 0.10) 
                                             (anotherItem 4 4.10) 
                                             (item        5 2.51))
                   sum number)
6.72

REDUCE別のオプションです:

CL-USER 20 > (reduce '+
                     '((anItem      2 0.01) 
                       (item        3 0.10) 
                       (anotherItem 4 4.10) 
                       (item        5 2.51))
                     :key 'third)
6.72
于 2013-10-28T20:05:31.900 に答える
3

last値ではなく、リストの最後のコンス セルを返します。(car (last x))代わりに使用する必要があります。

于 2013-10-28T18:20:43.197 に答える
2

コードを短くするのではなく、正確な結果を得たい場合に備えて:

(defun kahan-sum (floats)
  (loop
     :with sum := 0.0 :and error := 0.0
     :for float :in floats
     :for epsilon := (- float error)
     :for corrected-sum := (+ sum epsilon) :do
     (setf error (- corrected-sum sum epsilon) sum corrected-sum)
     :finally (return sum)))

(defun naive-sum (floats) (loop :for float :in floats :sum float))

(let ((floats (loop :repeat 1000 :collect (- (random 1000000.0) 1000000.0))))
  (format t "~&naive sum: ~f, kahan sum: ~f" (naive-sum floats) (kahan-sum floats)))
;; naive sum: -498127420.0, kahan sum: -498127600.0

このように機能する理由について詳しくは、http: //en.wikipedia.org/wiki/Kahan_summation_algorithmをご覧ください。

于 2013-10-29T07:17:44.440 に答える
0

パーティーに遅れてくる… じゃなくて、ちょっと口ずさむのはどうloop?;-)

(defun sum-3rd (xs)
  (let ((sum 0))
    (dolist (x xs sum) 
      (incf sum (nth 2 x)))))
于 2013-11-20T03:27:57.550 に答える