プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q06:(改造版)コラッツの予想。

コラッツの予測

自然数nについて、

  • nが偶数の場合、nを2で割る
  • nが奇数の場合、nに3をかけて1を足す

という操作を繰り返す時、初期値がどんな数値であっても必ず1に到達する。

Q: 初回のみnに3をかけて1を足すことから始めた場合、「最初の数に戻る数」が10000以下の偶数のうち何個か求める。

def collatz(num:Int, target:Int):Boolean = {
  if(num == target) true
  else if(num == 1) false
  else if(num%2 == 0) collatz(num/2, target)
  else collatz(num*3+1, target)
}

(2 to 10000 by 2).count(num => collatz(num*3+1, num))