List 嵌套列表平均值
大家好,我已经实现了一个解决方案来查找嵌套列表的平均值。所以我想知道你是否能想出一个更好的解决方案,或者在我的欢呼声中出现任何可能的错误List 嵌套列表平均值,list,lisp,List,Lisp,大家好,我已经实现了一个解决方案来查找嵌套列表的平均值。所以我想知道你是否能想出一个更好的解决方案,或者在我的欢呼声中出现任何可能的错误 ; takes a nested list and return a flattened list (defun flatten-list (list) (cond ((null list) list) ((atom list) (list list)) ((list (first list))
; takes a nested list and return a flattened list
(defun flatten-list (list)
(cond
((null list) list)
((atom list) (list list))
((list (first list))
(append (flatten-list (first list))
(flatten-list (rest list))))
(t
(append (list (first list))
(flatten-list (rest list))))
))
;takes a flattened list and return the sum of the numbers
(defun sum-list (list)
(cond ((null list)
0)
(t
(+ (first list) (sum-list(rest list))))
))
;uses the flatten-list and nested-average to find the average
(defun nested-average (list)
(sum-list (flatten-list list))
(defvar flat-lis)
(setf flat-list (flatten-list list))
(/ (sum-list flat-list) (length flat-list)
))
第一个函数包含无法访问的代码。这种代码永远不会被使用。文档字符串也是错误的,因为它没有真正描述函数的功能 第二个函数最好使用
REDUCE
编写
第三个函数需要重写。不使用第一个表单的值。使用
DEFVAR
和SETF
是错误的。我认为这是更好的解决方案
(defun tree-average (tree)
(labels ((%tree-average
(branch sum visited)
(cond
((consp branch)
(multiple-value-call
#'%tree-average (cdr branch)
(%tree-average (car branch) sum visited)))
((numberp branch)
(values (+ sum branch) (1+ visited)))
(t (values sum visited)))))
(multiple-value-call #'/ (%tree-average tree 0 0))))
好吧,如果你问的话。你试过运行它吗?你用输入测试了吗?你编译了吗?当然,我编译并运行了我所有的测试,但我对lisp不熟悉,我正在寻找新的更优雅的解决方案。这个问题属于1-你说第一个函数包含永远不会使用的无法访问的代码是什么意思。2-第二个函数如何使用reduce,3-你是说最好使用(defvar flat lis(展平列表))。@没关系:函数中的一部分代码可以删除,它永远不会被使用。COND中的最后一个子句将永远不会执行。如何使用reduce编写第二个函数,以及为什么defvar和setf不正确?@不要紧,因为
defvar
只在顶层才有意义。要在函数中绑定变量,请使用let
。由于没有设置任何新值,let的结果形式可以是您需要的值,因此不需要setf
。(多值调用#'/(%tree average tree 0))