[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
A Couple of Fun Programs
Jonathan sent out an interesting program the other day, and I was prompted
to send two more. These are (ugh, bletch) Common Lisp programs, but I
think it's instructive to see that CL programs don't have to look
completely silly (not using DO loops, &-constructs, &tc). It's your job
to figure them out without running them. LABELS is like LETREC, TRUNCATE
rounds towards 0, (VALUES x y z) returns three values, and
(MULTIPLE-VALUE-BIND (X Y Z) (RETURN-THREE-VALUES) . <forms>) binds the
three variables X, Y, and Z appropriately and executes <forms>.
(defun f (n)
(labels ((f (n m)
(if (= n m)
n
(let ((h (truncate (+ m n) 2)))
(* (f n h) (f (+ h 1) m))))))
(f 1 n)))
(defun f (i)
(labels ((g (n n-1 n-2 m m-1 m-2)
(let ((k (* n-1 m-1)))
(values (+ (* n m) k)
(+ (* n m-1) (* n-1 m-2))
(+ k (* n-2 m-2)))))
(h (i)
(cond ((zerop i) (values 1 0 0))
((= i 1) (values 1 1 0))
((evenp i)
(multiple-value-bind (n n-1 n-2)
(h (truncate i 2))
(g n n-1 n-2 n n-1 n-2)))
(t
(multiple-value-bind (n n-1 n-2)
(h (1- i))
(g 1 1 0 n n-1 n-2))))))
(prog1 (h i))))
They are written using non-instructive variable names.
-rpg-