; 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)