多倍長整数を使えば簡単です。
def sum_digits(n :BigInt) :Int = if(n == 0) 0 else (n % 10).toInt + sum_digits(n / 10) val N = 1000 val n = (1 to N).foldLeft(BigInt(1))((x, y) => x * 2) println (sum_digits(n))
しかし、使わなくても簡単です。1桁ずつリストにすればよいでしょう。2倍を繰り返すだけなので単純なコードになります。
def twice(a :List[Int], carry :Int = 0) :List[Int] = a match { case Nil => if(carry == 0) Nil else List(carry) case d :: tail => { val m = d * 2 + carry (m % 10) :: twice(tail, m / 10) } } val N = 1000 val a = (1 to N).foldLeft(List(1))((x, y) => twice(x)) println (a.sum)