;;; Solucao baseada na seguinte formula: ;;; ipl(v) = 0, se v e' folha ;;; ipl(v) = sum {v -> u} [ ipl(u) + size(u) ], ;;; onde size(x) e' o tamanho (em numero de nos) da subarvore que tem ;;; x como raiz. Para size, a recorrencia e': ;;; size(v) = 1, se v e' folha ;;; size(v) = 1 + sum {v -> u} size(u) ;;; Para implementar estas formulas, decidimos fazer com que ipl(v) ;;; retortnasse dois valores: o ipl e o tamanho (size), usando o ;;; recurso de multiplos valores de Lisp. (defun ipl (tree) (if (leaf tree) (values 0 1) (let ((sumipls 0) (sumsizes 0)) (dolist (child (children tree) (values (+ sumipls sumsizes) (1+ sumsizes))) (multiple-value-bind (cipl csize) (ipl child) (setf sumipls (+ sumipls cipl)) (setf sumsizes (+ sumsizes csize)) ) ) ) ) ) (defun leaf (tree) (atom tree) ) (defun children (tree) (rest tree) )