;;; Sábado 7 de noviembre de 2015
;; https://en.wikipedia.org/wiki/Collatz_conjecture
;; obtención una secuencia de Collatz
(defun collatz(n)
(if (positivo n)
(prog (print n)
(collatz (siguiente n)))))
;; me gusta más el if con prog, ya que el término when evoca temporalidad,
;; me gusta más el if sin prog, pero aquí es necesario.
;; cond queda demasiado rimbombante en este caso.
(defun collatz(n)
(cond ((positivo n)
(print n)
(collatz (siguiente n)))
(T 'fin))))
(defun collatz(n)
(when (positivo n)
(print n)
(collatz (siguiente n))))
;; rango al que se aplica, números positivos mayores que 1
(defun positivo(n)
(and (numberp n)(>= n 2)))
;; regla que determina el siguiente número, creciente o decreciente
(defun siguiente(n)
(if (par? n)
(mitad n)
(add1 (triple n)))
(defun collatz(n)
(when (>= n 2)
(format t "~a " n)
(collatz (if (par? n)
(mitad n)
(add1 (* 3 n)) ) ) ) )
(defun collatz(n)
(when (>= n 2)
(format t "~a " n)
(collatz (if (mult2 n)
(mitad n)
(add1 (* 3 n)) ) ) ) )
(defun mitad(n)
(/ n 2))
(defun par?(n)
(mult2 n))
(defun mult2(n)
(if (zerop (mod n 2))
t
nil))
(defun add1(n)
(+ 1 n))