LISP - 如何从嵌套列表中获取平均长度?一步一步解释

时间:2018-04-15 09:59:55

标签: list nested lisp common-lisp average

我知道这个答案得到了回答,但我是LISP的新手而且我没有得到它!

LISP - How to get the average length for nested lists?

(defun nested-lists-average-length (ls &aux (i 0) (n 0))
  (dolist (a ls (float (/ _______))) ;maybe (/ i n) ;;get average lenght of list
    (if (_______ a) ;??
      (progn (_______ i) ;??
             (incf n (_______ a) ))))) ;?

我写了这个函数:

(defun average-sublist-length (list &aux (sum 0) (n 0))
  (dolist (x list (when (plusp n) (/ sum n))) 
    (when (plusp x)
      (incf sum (min x 100)) 
      (incf n)))) 

(average-sublist-length '(1 2 3 4 (5 6 7) 8 9)) 

如果我想要执行此操作,我会收到错误:

  

PLUSP:(5 6)不是真实的数字现在我在调用它时遇到了问题。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

添加调试信息:

  ....
  (dolist (a ls ....)
    (print `(:debug :i ,i :n ,n :a ,a))
    (if ....) 
  ....

the question you link to中的示例打印以下内容:

(nested-lists-average-length '(1 (2 3 4) 5 (6 7) 8 (9)))

(:DEBUG :I 0 :N 0 :A 1) 
(:DEBUG :I 0 :N 0 :A (2 3 4)) 
(:DEBUG :I 1 :N 3 :A 5) 
(:DEBUG :I 1 :N 3 :A (6 7)) 
(:DEBUG :I 2 :N 5 :A 8) 
(:DEBUG :I 2 :N 5 :A (9))

答案 1 :(得分:0)

为什么不考虑解决问题的方法呢?

计算列表的子列表的平均长度,给定列表,到目前为止您看到的子列表长度的运行总数s,以及列表中有趣元素的数量n到目前为止看到了:

  • 是空列表吗?
    • 如果是,那么答案就是s / n。
    • 如果不是那么第一个元素是否有趣(列表)?
      • 如果 有趣,那么答案就是列表其余部分的平均子列表长度,其中s变为s +第一个元素的长度,n变为n + 1;
      • 如果不是,则答案是列表s的其余部分的平均子列表长度,n具有相同的值。

所以,把它变成一个函数:

(defun average-sublist-length (l s n)
  (if <list is empty>
    (/ s n)
    (if <first element is interesting>
         <call average-sublist-length with
               the rest of l, s + length of 1st elt and n + 1>
         <call average-sublist-length with 
               the rest of l, s and n>)))

现在你需要弄清楚调用应该是什么样的,初始调用应该是什么样的,并编写一个小包装函数,以正确的方式调用它(或使用labels并使其成为本地函数)。