前問とほとんど同じです。再帰に持ち込んでメモ化です。
import scala.collection.mutable.Map import scala.testing.Benchmark object DivIntegerByPrime { val primes :Stream[Int] = 2 #:: Stream.from(3).filter(is_prime) def is_prime(n :Int) :Boolean = primes.takeWhile(p => p * p <= n).forall(p => n % p != 0) val memo = Map[(Int,Int),Long]() def apply(n :Int) :Long = f(n, n) - (if(is_prime(n)) 1 else 0) def clear() = memo.clear() private def f(n :Int, m :Int) :Long = if(n == 0) 1 else if(memo.contains((n, m))) memo((n,m)) else { val s = primes.takeWhile(m >=).map(p => f(n - p, p.min(n - p))).sum memo((n,m)) = s s } } def solve() = { val N = 5000 println (Iterator.from(2).map(n => (n, DivIntegerByPrime(n))). filter(x => x._2 > N).next._1) DivIntegerByPrime.clear() } object Test extends Benchmark { def run() = solve } println (Test.runBenchmark(10))