/014/14.scm

http://github.com/cfx/schemeuler · Scheme · 41 lines · 38 code · 2 blank · 1 comment · 0 complexity · 1b19d299a1b356ec51a971a9d81a6f01 MD5 · raw file

  1. ;;; a: 837799
  2. (define problem-14
  3. (lambda (n)
  4. (letrec ([t 0]
  5. [h (make-eqv-hashtable)]
  6. [S (lambda (n fn)
  7. (cond
  8. ((eq? n 1) (fn n 1))
  9. ((hashtable-ref h n #f)
  10. (fn n (hashtable-ref h n 0)))
  11. ((odd? n)
  12. (odd-seq n fn))
  13. (else (even-seq n fn))))]
  14. [even-seq
  15. (lambda (n fn)
  16. (S (/ n 2) (col n fn)))]
  17. [odd-seq
  18. (lambda (n fn)
  19. (S (+ 1 (* 3 n)) (col n fn)))]
  20. [col (lambda (n fn)
  21. (lambda (ref val)
  22. (let ()
  23. (hashtable-set! h ref val)
  24. (set-t ref val)
  25. (fn n (+ val 1)))))]
  26. [set-t (lambda (ref val)
  27. (if (< (hashtable-ref h t 0) val)
  28. (set! t ref)))])
  29. (let loop ([n n])
  30. (if (eq? n 1)
  31. t
  32. (let ()
  33. (S n (lambda (ref val)
  34. (let ()
  35. (hashtable-set! h ref val)
  36. (set-t ref val)
  37. (hashtable-ref h ref 0))))
  38. (loop (- n 1))))))))
  39. (display (problem-14 100000))