ANSI Common Lisp

(defun make-incr (min max &optional (steps 1))
  (lambda (lst)
    (labels ((local-incr (local-lst)
                         (cond ((null (car local-lst))
                                nil)
                               ((< (car local-lst) max)
                                (append (list (+ (car local-lst) steps)) (cdr local-lst)))
                               (t
                                (append (list min) (local-incr (cdr local-lst)))))))
            (local-incr lst))))

'(1 1 1)を一回通すと、'(1 1 2)にしてくれる関数を作る関数。
…reverseするのが面倒臭くって'(2 1 1)になってるけど。
これを呼び回すことによってすべての出る値を網羅できるのですよ。
網羅する方のプログラムはまた今度。