4

類似商品の平均価格から新商品の価格を求めたい。関数get-k-similarはk最近傍法を使用しますが、この出力を返します ((list rating age price) proximity)

For example, 2-similar would be:
(((5.557799748150248 3 117.94262493533647) . 3.6956648993026904)
 ((3.0921378389849963 7 75.61492560596851) . 5.117886776721699))

同様のアイテムの平均価格を見つける必要があります。つまり、平均117と75です。反復するためのより良い方法はありますか?私の関数はあまりにも醜いようです。

(define (get-prices new-item)

  (define (average-prices a-list)
    (/ (cdr 
        (foldl (λ(x y) (cons (list 0 0 0)
                             (+ (third (car x)) (third (car y))))) 
               (cons (list 0 0 0) 0)
               a-list))
        (length a-list)))

    (let ((similar-items (get-k-similar new-item)))
      (average-prices similar-items)))
4

2 に答える 2

5

Common Lisp

(/ (reduce '+ a-list :key 'caddar) (length a-list))

また

(loop for ((nil nil e) . nil) in a-list
      count e into length
      sum e into sum
      finally (return (/ sum length)))
于 2009-07-17T18:05:07.943 に答える
3

簡単なことを実行して、3つおきの値を引き出すことができます。

(define (average-prices a-list)
  (/ (apply + (map fourth a-list)) (length a-list)))

これは中間リストを作成するため、少し非効率的です。これが、あなたが試した理由だと思いますfoldl。これを行う正しい方法は次のとおりです。

(define (average-prices a-list)
  (/ (foldl (lambda (x acc) (+ (third x) acc)) 0 l)
     (length a-list)))

まだマイナーな非効率性があります-2回目のスキャンを実行しています-しかし、目に見える速度低下を得るには非常に長いリストlength必要になるため、これは気にする必要はありません。

于 2009-07-17T18:34:34.220 に答える