質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

589閲覧

JS ジェネレーター関数について

kaito1106

総合スコア2

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/08/06 10:56

JavaScript入門書のサンプルコードにて、素数のみを出力するジェネレーター関数の質問です。
isPrime関数のfor命令で、Mathオブジェクトで平方根に変換していますが、なぜこの変換が必要なのか
さっぱりわかりません。引数のvalueをそのままつかえばいいのにな、、と思いMathオブジェクトを削除
してvalueのみを記述すると何も出力されませんでした。

有識者の方、できるだけわかりやすく教えていただけると助かります。
よろしくお願い致します。

function* genPrimes() {
let num = 2; //素数の開始値
while(true) {
if(isPrime(num)) {yield num;}
num++;
}
}

function isPrime(value) {
let prime = true;
for(let i=2; i <= Math.floor(Math.sqrt(value)); i++) {
if(value % i === 0) {
prime = false;
break;
}
}
return prime;
}

for(let value of genPrimes()) {
if(value > 100) {break;}
console.log(value);
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こたえ:
ループの回数を減らすため。
(ある数が素数かどうか調べたい場合は、その数の平方根までの数で割り切れるかどうかを調べればいいから)

たとえばこの問題は次のようなプログラムでもとける。

(for(let i=2; i <= Math.floor(Math.sqrt(value)); i++) {

for (let i = 2; i < value; i++) {
に変えただけ)

function* genPrimes() { let num = 2; //素数の開始値 while (true) { if (isPrime(num)) { yield num; } num++; } } function isPrime(value) { let prime = true; for (let i = 2; i < value; i++) { if (value % i === 0) { prime = false; break; } } return prime; } for (let value of genPrimes()) { if (value > 100) { break; } console.log(value); }

たとえば15が素数かどうか調べたいとして
上のコードではforループでi=2~14まで1ずつ増やしていって、割り切れるかどうかを調べることになる。
i=3の場合、15÷3=5 余り ゼロなので、value % i ===0となって、primeにfalseが設定されてbreakされる。(素数ではない)

でも17が素数かどうかを調べたい場合、上のコードはi=16までループしてやっと「17は素数」という正しい答えを出してくれるが
17の平方根は4.123…なので、実際には2~4まで調べればいい。
4まで調べて割り切る数がなければ、その時点で素数であると判定できる。
(4まで調べて割り切る数がなければ、5以上の整数で割り切れないことは自明)


「何も出力されませんでした。」の理由は
たぶん
for (let i = 2; i < value; i++) {

for (let i = 2; i <= value; i++) {
にしたんだろう。
このばあい、valueが素数であったとしても、iがvalueに等しいとき必ず割り切れるので、合成数であると誤判定される

投稿2022/08/06 11:09

編集2022/08/06 15:02
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaito1106

2022/08/06 11:55

cm67809733さん。 とてもわかりやすい回答ありがとうございます!! 「2 <= 平方根」までで、割り切れなければ素数となる、ということがわかりました。 非常にわかりやすかったです。 初学者なので、ループについて詳しくないのですが、ループの回数が多すぎるとプログラムの 処理能力に影響があったりするのですか? なるべく早い段階でループから脱出するようなコードを心がけるべきでしょうか。 ご教授願います。
退会済みユーザー

退会済みユーザー

2022/08/06 15:02

>ループの回数が多すぎるとプログラムの処理能力に影響があったりするのですか? はい。一般的に、比較する回数が多ければ多いほど、結果が求まるまで時間がかかるものです。 >なるべく早い段階でループから脱出するようなコードを心がけるべきでしょうか。 一般的に、yes。
kaito1106

2022/08/07 03:20

理解しました! ループ処理を記述する際は、なるべく負担が少なくなるようなコードを心がけてみます。 ありがとうございました^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問