我一直在努力达到嵌套列表的平均值,这就是我目前所拥有的:

(defun nested-average2 (tree &optional (sum 0) (count 0))
  (cond ((null tree)
         (/ sum count))
        ((listp (first tree))
         (nested-average2 (rest tree)
                          (nested-average2 (first tree) sum)
                          (incf count)))
        (t
         (nested-average2 (rest tree)
                          (+ sum (first tree))
                          (incf count)))))

但是它返回非整数
例如,使用这个(nested-average2 ' (10 ((30 1) 20) (8 (5 (50 7)) 9) 40)),当它应该返回18时返回2425/192

最佳答案

您的代码适用于普通列表,但不适用于子列表。
其中一个问题是,当您在子列表上递归时,您只增加一个计数,而不是增加已处理的元素的数量。
另一种情况是,在这种情况下,你已经计算出一个“次平均值”,并将其加到总和中。
最简单的方法是计算和和和计数,直到处理完整棵树;然后才应该进行最后的除法来计算平均值,例如:

(defun nested-average (sxp)
  (labels
      ((sub (sxp tot cnt)
         (cond
          ((null sxp)  (values tot cnt))
          ((consp sxp) (multiple-value-bind (tot1 cnt1) (sub (car sxp) tot cnt)
                         (sub (cdr sxp) tot1 cnt1)))
          (t           (values (+ tot sxp) (1+ cnt))))))
    (multiple-value-bind (tot cnt) (sub sxp 0 0)
      (/ tot cnt))))

10-08 19:00