>>73 さんのはscheme

安直で冗長だが
* or / が出てきたら前後の項をあわせて括弧でくくる
というやり方でもいける

(defun sub (exp)
(cond ((atom exp) exp)
((case (length exp)
(1 (sub (car exp)))
(3 (cons (cadr exp) (list (sub (car exp)) (sub (caddr exp)))))
(t (case (cadr exp)
((* /) (sub (cons (list (car exp) (cadr exp) (caddr exp)) (cdddr exp))))
((+ -) (list (cadr exp) (sub (car exp)) (sub (cddr exp))))))))))