problem 14

問題14です。

(define table (make-hash-table))

(define (count ini)
  (define (next n)
    (if (= (modulo n 2) 0) (/ n 2) (+ (* n 3) 1)))
  (define (count-iter n i)
    (if (= n 1)
      (begin
        (hash-table-put! table ini i)
        i)
      (let1 memo (hash-table-get table n #f)
            (if memo
              (let1 newi (+ memo i -1)
                    (hash-table-put! table ini newi)
                    newi)
              (count-iter (next n) (+ i 1))))))
  (count-iter ini 1))

(define (p14)
  (let loop ((maxcount 0)
             (maxnum 0)
             (n 1))
    (if (= n 1000000) maxnum
      (let* ((newcount (max (count n) maxcount))
             (newnum (if (= newcount maxcount) maxnum n)))
            (loop newcount newnum (+ n 1))))))

(print (p14))

答えを記憶しておかないと、時間が掛かりすぎます。

わかったこと

  • make-hash-table, hash-table-put!, hash-table-get でそれぞれハッシュテーブルの生成、ハッシュテーブルへの挿入、ハッシュテーブルからの取得ができるということ。