; double and increment (define (make-queue) (list (list))) (define (enqueue q x) (cons (car q) (cons x (cdr q)))) (define (head q) (if (pair? (car q)) (caar q) (if (pair? (cdr q)) (car (reverse (cdr q))) (error 'head "empty")))) (define (tail q) (if (pair? (car q)) (cons (cdar q) (cdr q)) (if (pair? (cdr q)) (cons (cdr (reverse (cdr q))) (list)) (error 'tail "empty")))) (define (f a b) (let loop ((q (enqueue (make-queue) (list (list a b))))) (let ((p (head q)) (q (tail q))) (cond ((= (caar p) (cadar p)) (reverse p)) (else (let ((t (enqueue q (cons (list (+ 1 (caar p)) (* 2 (cadar p))) p)))) (loop (enqueue t (cons (list (* 2 (caar p)) (+ 1 (cadar p))) p))))))))) (display (f 1 8)) (newline)