fork(2) download
  1. ; triple or add five
  2.  
  3. (define (make-queue) (list (list)))
  4.  
  5. (define (enqueue q x) (cons (car q) (cons x (cdr q))))
  6.  
  7. (define (head q)
  8. (if (pair? (car q))
  9. (caar q)
  10. (if (pair? (cdr q))
  11. (car (reverse (cdr q)))
  12. (error 'head "empty"))))
  13.  
  14. (define (tail q)
  15. (if (pair? (car q))
  16. (cons (cdar q) (cdr q))
  17. (if (pair? (cdr q))
  18. (cons (cdr (reverse (cdr q))) (list))
  19. (error 'tail "empty"))))
  20.  
  21. (define (empty? q) (and (null? (car q)) (null? (cdr q))))
  22.  
  23. (define (triple-or-add-five n)
  24. (let loop ((queue (enqueue (make-queue) (list n))))
  25. (if (empty? queue) #f
  26. (let ((seq (head queue)) (queue (tail queue)))
  27. (if (= (car seq) 1) seq
  28. (if (< (car seq) 1) (loop queue)
  29. (let ((queue (enqueue queue (cons (- (car seq) 5) seq))))
  30. (if (zero? (modulo (car seq) 3))
  31. (loop (enqueue queue (cons (/ (car seq) 3) seq)))
  32. (loop queue)))))))))
  33.  
  34. (display (triple-or-add-five 24)) (newline)
  35. (display (triple-or-add-five 99)) (newline)
  36. (display (triple-or-add-five 15)) (newline)
Success #stdin #stdout 0.02s 8288KB
stdin
Standard input is empty
stdout
(1 3 8 24)
(1 6 11 33 99)
#f