【JS学習マラソン】第15回 1.2.12 ループ: while と for
JavaScript学習マラソンの第15回は、
「現代の JavaScript チュートリアル」パート1の2.12「ループ: while と for」です。
ループ: while と for https://ja.javascript.info/while-for
を読んでみます。
プログラムに必要な制御
C言語やJavaScriptのような手続型言語では、プログラムの動きをコントロールするために、3つの仕組みが用意されています。
それが、「構造化プログラミング」の「順次」「反復」「分岐」です。
(「分岐」は、「条件分岐」とか「選択」などとも表記されます。)
(こういうプログラミングに関する豆知識は、コンピューターサイエンスで詳細が説明されていますが、簡単なまとめとしては情報処理試験の教科書などでも説明されています。)
キタミ式イラストIT塾 基本情報技術者 平成31/01年 (情報処理技術者試験)
- 作者: きたみりゅうじ
- 出版社/メーカー: 技術評論社
- 発売日: 2018/12/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 順次 順接、順構造とも言われる。プログラムに記された順に、逐次処理を行なっていく。プログラムの記述とコンピュータの動作経過が一致するプログラム構造である。
- 反復 一定の条件が満たされている間処理を繰り返す。
- 分岐 ある条件が成立するなら処理Aを、そうでなければ処理Bを行なう。
- 選択 → if、switch
- 反復 → for、while
JavaScriptでは、「for文」や「while文」が用意されており、繰り返しを実現できます。
forやwhileの文法、使い方はチュートリアルの説明通りですね。
無限ループの使いどころ
while文を使うと、無限ループ(永久ループ)を作れます。
while(true) { ... } とか、while(1) { ... } などと書けば、ずっと条件が成立しているので、永久にwhileが繰り返されます。
無限ループは、ゲームなどでユーザーの入力を待ち続ける処理などで使われます。
意図的に無限ループを使う場合は、途中で止める処理も入れておきます。
(ある条件を満たしたら、breakでループを脱出する、など。)
繰り返しの条件を間違えて設定して、意図せず無限ループになってしまう場合もあるので、注意しましょう。
繰り返しは再帰でも書ける
手続型プログラミングでは、「繰り返し」はforやwhileで書けますが、同じことは関数型プログラミングの「再帰」でも書けます。
再帰呼出し(さいきよびだし、英: recursive call)は、プログラミング技法の一つである。
手続きや関数といった概念をもつプログラミング言語では、ある手続き中で再びその手続き自身を呼び出すことを認める場合が多い。これを再帰呼出しといい、階乗計算やフィボナッチ数列のように、本来再帰的な構造をもつアルゴリズム(再帰的アルゴリズム)を記述するのに適している。
先ほどの構造化プログラミングの制御構造と関数型プログラミングの仕組みを対応させると、
- 順次 → (関数の)合成
- 選択 → パターンマッチ
- 反復 → 再帰
というかんじです。
JavaScriptでの再帰の使い方は、チュートリアルの「6.1 再帰とスタック」で解説されていました。
とりあえず、最初はforやwhileで繰り返しを書きましょう。
慣れてきたら、再帰の使い方も練習してみたら良いと思います。
(別に無理して再帰を使わなくてもOK)
副作用の有無
- 手続型の繰り返し → 副作用を使う
- 関数型の再帰 → 副作用を使わない
という違いがあります。
副作用なしで繰り返しを書きたい場合に、再帰が便利です。
再帰を使う場合は、いくつかの注意点があります。
- 繰り返す回数が多過ぎる場合、メモリー不足(スタックオーバーフロー)のエラーが発生します。
- 「末尾再帰」(Tail Call)を使うと、メモリー不足を解決できます。(ただし、ほとんどのWebブラウザーはJavaScriptの末尾再帰に対応してないので使えません。)
- 「アキュームレーター」(Accumulator:累算器、積算器、加算器)を使うと、再帰を簡潔に書ける場合があります。
まとめ
- JavaScriptで処理の繰り返しを書く場合は、forやwhileが用意されている。
- 無限ループを使うときは、途中で停止させる処理も入れておく。
- 繰り返しは「再帰」を使っても書ける。
スラスラ読める JavaScript ふりがなプログラミング (ふりがなプログラミングシリーズ)
- 作者: リブロワークス,及川卓也
- 出版社/メーカー: インプレス
- 発売日: 2018/06/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る