我知道这个答案得到了回答,但我是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)不是真实的数字现在我在调用它时遇到了问题。
感谢您的帮助!
答案 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到目前为止看到了:
所以,把它变成一个函数:
(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
并使其成为本地函数)。