漠然としたタイトルのために大いに謝りますが、私は詳しく述べる必要があります。ここで私はhttp://ariya.ofilabs.com/2013/07/prime-numbers-factorial-and-fibonacci-series-with-javascript-array.htmlに読み、問題のコードは、次のとおりです。私たちはいくつかの出力を見ることができるようにこのJavaScript関数はなぜ機能しますか?
function isPrime(i) {
return (i > 1) && Array.apply(0, Array(1 + ~~Math.sqrt(i))).
every(function (x, y) {
console.log(x + ' ' + i % y);
return (y < 2) || (i % y !== 0)
});
}
isPrime(23);
isPrime(19);
isPrime(188);
楽しみのためだけに、私はこれらのログを追加しました:
undefined NaN
undefined 0
undefined 1
undefined 2
undefined 3
undefined NaN
undefined 0
undefined 1
undefined 1
undefined 3
undefined NaN
undefined 0
undefined 0
これは、すべて私が持っている最初の時間ですapply
とevery
見て、そう私と一緒にクマが、私の理解がapply
は、基本的には、第1引数はそのthis
の代替であり、第二は、出力されたアレイの機能を呼び出していることです...それは有用であろうと思わないだろう決して、しかし、この機能はうまくいくようです...
ここでは、問題の番号の平方根に等しい長さの配列を作成しているようです。私は平方根が問題の数の可能な最大要因であるので意味があると思います。
> var i = 23;
undefined
> Array.apply(0, Array(1 + ~~Math.sqrt(i)));
[ undefined, undefined, undefined, undefined, undefined ]
グレート、それは5 undefined
の配列です:我々は最初の数、たとえば、のためにその配列を記録した場合
OK、ここからので、それは次のようになります。さて、ここから、every
メソッドは、その配列のすべての要素がコールバック関数のテスト(または何でも)を渡すかどうかをチェックすることになっています。
Microsoftのドキュメントをevery
方法のための3つの可能な引数を指定しています
- 値
- インデックス
- 配列
したがって、この例ではx
は、値、すなわちundefined
ですy
がインデックスです。
私たちの出力は、その結論に同意します。しかし、私はまだネストされたreturn文については曖昧です(最低のものが返され、親も戻りますか?)、ここで||
演算子(最初のテストが合格すれば、すべてのループは停止しますか?働く
EDIT
ログはX、Yしないでなければなりません。私のミス:
console.log(y + ' ' + i % y); -> console.log(x + ' ' + i % y);
EXPLANATION
ので、私はこのコードを渡って来たのか、あなたは尋ねますか?
function isPrime(n) {
for (var i = 2.0; i < Math.sqrt(n); i++) {
if (n % i === 0.0) {
return false;
}
}
return true;
}
public static boolean isPrime(double num) {
for (double i = 2.0; i < sqrt(num); i++) {
if (num % i == 0.0) {
return true;
}
}
return false;
}
やPython
def isPrime(num):
x = 2
isPrime = True
while x < math.sqrt(num):
if num % x == 0:
isPrime = False
break
x = x + 1
return isPrime
やJSしかし、私がしたかったと言う:まあ、もちろん、Javaでプライムをチェックする最も簡単な方法は、次のようになります600851475143
のような数字の最大の素因数を調べるこれらのループ方法は時間がかかりすぎるでしょうか?私は、この「ハック」は、整数や浮動小数点の代わりに配列を使用しているため、それが効率的ではないかもしれないと思っていますが、それでもなお問題を解決するための効率的な方法を探していました。
私は間違いなくあなたと同じ 'はconsole.log()'出力を得ることはありません、と私は驚いていませんよ。 'y'は決して' undefined'であってはなりません。 – Pointy
あなたが見つけたブログには、その 'Array()'トリックに関する記事があります。 – Pointy
うん、私はブログを読んだが、この部分に立ち往生した。それを理解できないので、ここに来ました。 – pward