引数(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の書き方は知らない人が見ると面食らうかもしれませんが、慣れた人からするとスッキリしてむしろわかりやすいのではないのでしょうか。