院卒新人サラリーマンのメモ代わり

備忘としてのメモを記載

99 problemについて

途中からだいぶ数学チックになってきた。
ちょっと飛ばそう。
あとコードが汚い気がする。
Q31,素数か判定する関数の答え

let is_prime = n => {
  let n = abs(n);
  let rec is_not_divisor = d =>
    d * d > n || n mod d != 0 && is_not_divisor(d + 1);
  n != 1 && is_not_divisor(2);
};

これわかりにくいよね。
d * d > nが満たされたらtrueが返る。
d * d > nが満たされる前にn mod d != 0がfalseになったら終了。(&&だから右が評価されなくなる)

改良

let is_prime2 = n => {
  let rec aux = (n, k) =>
    switch (k) {
    | 1 => true
    | _ => n mod k != 0 && aux(n, k - 1)
    };
  aux(n, n - 1);
};
//k=1 true
//k>1 「nが2..kで割り切れない」 =「nがkで割り切れない」&&「nが2..k-1で割り切れない」