2012-11-03 79 views
0

大家好我已经实现了一个解决方案来查找嵌套列表的平均值。所以我想知道你是否可以想出更好的解决方案或任何可能的错误与我的欢呼声。嵌套列表的平均值

; 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) 
)) 
+0

你尝试过吗?你用输入来测试它吗?你编译它了吗? –

+0

当然,我做了,它正在编译和运行我所有的测试,但我是新来的lisp,我正在寻找新的更优雅的解决方案。 –

+1

这个问题属于http://codereview.stackexchange.com – finnw

回答

1

我觉得这是更好的解决方案...

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

好吧,如果你问。

+0

(多值调用#'/(%树平均树0 0)​​) –

1

第一个函数包含无法访问的代码。该代码将永远不会被使用。文档字符串也是错误的,因为它没有真正描述函数的功能。

第二个函数最好用REDUCE写成。

第三个函数需要重写。第一种形式的价值不被使用。使用DEFVARSETF是错误的。

+0

1 - 你是什么意思,第一个函数包含永远不会被使用的不可到达的代码。 2 - 我如何使用减少第二个功能和3 - 你是否说使用它更好(defvar flat-lis(flatten-list list))。 –

+0

@不重要:函数中的部分代码可以被删除,但不会被使用。 COND中的最后一个句子永远不会被执行。 –

+0

如何使用reduce函数来编写第二个函数,以及为什么defvar和setf不正确? –