プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。前回で第1章が終わって、第2章に突入。今回は、Q11:フィボナッチ数列。

Q: フィボナッチ数列のうち、各桁の数字を足した数で割り切れ、144より大きなものを小さい順に5つ求める。

def fibStream(a:BigInt, b:BigInt):Stream[BigInt] = a #:: fibStream(b, a+b)

def digits(num:BigInt, acc:Seq[BigInt] = Nil):Seq[BigInt] = {
  if(num/10 == 0) num+:acc
  else digits(num/10, num%10+:acc)
}

fibStream(0,1).filter{ fib =>
  fib > 144 && fib % digits(fib).sum == 0
}.take(5).mkString("\n")