; sum square digits sequence

(define (square x) (* x x))

(define (digits n . args)
  (let ((b (if (null? args) 10 (car args))))
    (let loop ((n n) (d '()))
      (if (zero? n) d
          (loop (quotient n b)
                (cons (modulo n b) d))))))

(define (sum xs) (apply + xs))

(define (ssds n) ; sum square digits sequence
  (let loop ((n n) (ns (list)))
    (if (or (= n 1) (member n '(4 16 37 58 89 145 42 20)))
        (reverse (cons n ns))
        (let ((x (sum (map square (digits n)))))
          (loop x (cons n ns))))))

(display (ssds 19)) (newline)
(display (ssds 18)) (newline)