LoginSignup
0

More than 5 years have passed since last update.

Ramdaで素数を列挙する

Last updated at Posted at 2018-06-07

引数(min,max)をとり、min以上max以下の素数を配列として返す関数を作ります。
Ramdaと非Ramda(Plain JS)で2通り書きます。再帰は使いません。

dispPrimeNum(4,30) // =>[5,7,11,13,17,19,23,29]
のように使います。

Ramda版

下記のようになります。

prime.js
// isDivBy :: Number -> Number -> Boolean
const isDivBy = R.pipe(R.flip(R.mathMod), R.equals(0));
// isPrimeNum :: Number -> Boolean
const isPrimeNum = R.chain(R.allPass, R.pipe(R.dec, R.range(2), R.map(R.complement(isDivBy))));
// dispPrimeNum :: Number -> Number -> [Number]
const dispPrimeNum = R.pipe(R.range, R.filter(isPrimeNum));

Plain JS版

再帰は使わないので下記のようになります。
もっといい方法がありそうですが、今は深夜なのでこれが限界です。

prime.js
// PlainJSの場合(再帰未使用)
const dispPrimeNum = function (min, max) {
  let arr = [2];
  for (var i = 3; i <= max; i++) {
    let iIsPrime = true;
    for (let j of arr) {
      iIsPrime = iIsPrime && i % j !== 0;
    }
    if (iIsPrime) {
      arr.push(i);
    }
  }
  arr = arr.filter(n => n >= min);
  return arr;
}

比較してみて

Ramdaの書き方は知らない人が見ると面食らうかもしれませんが、慣れた人からするとスッキリしてむしろわかりやすいのではないのでしょうか。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0