Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 嵌套列表平均值_List_Lisp - Fatal编程技术网

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))