2012-11-03 3 views
0

Salut tout le monde J'ai mis en œuvre une solution pour trouver la moyenne d'une liste imbriquée. Alors je me demandais si vous pouviez penser à une meilleure solution ou à d'éventuelles erreurs avec les acclamations de ma part.liste imbriquée moyenne

; 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

avez-vous essayé de l'exécuter? Avez-vous testé avec entrée? L'avez-vous compilé? –

+0

bien sûr je l'ai fait, il compile et exécute tous mes tests, mais je suis nouveau à lisp et je suis à la recherche de nouvelles solutions plus élégantes. –

+1

Cette question appartient à http://codereview.stackexchange.com – finnw

Répondre

1

Je pense que cela est la meilleure solution ...

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

Eh bien, si vous demandez.

+0

(multiple-value-call # '/ (% tree-average tree 0 0)) –

1

La première fonction contient un code inaccessible. Ce code ne sera jamais utilisé. La chaîne de documentation est également incorrecte, car elle ne décrit pas vraiment ce que fait la fonction.

La deuxième fonction est mieux écrite en utilisant REDUCE.

La troisième fonction doit être réécrite. La valeur du premier formulaire n'est pas utilisée. L'utilisation de DEFVAR et de SETF est erronée.

+0

1 - Que voulez-vous dire que la première fonction contient du code inaccessible qui ne sera jamais utilisé. 2-comment puis-je utiliser réduire pour la deuxième fonction et 3 - dites-vous qu'il est préférable d'utiliser (defvar flat-lis (liste à plat-liste)). –

+0

@ Does Does Matter: une partie du code de la fonction peut être supprimée, elle n'est jamais utilisée. La dernière clause du COND ne sera jamais exécutée. –

+0

comment peut-on écrire la deuxième fonction en utilisant réduire et pourquoi la defvar et la setf ne sont pas correctes? –