前回の内容 while 構文 与えられた命令を、繰り返し実行する 関数の再帰的定義をする while ( 繰り返し条件 ) { 繰り返し命令 } 繰り返し条件 : 変数を含む条件式 繰り返し命令によって、 条件式に含まれる変数の値を変更(代入)して、 (結果として..) いつかは条件が成立しなくなるようにする必要がある 「代入を繰り返す」ための構文 cf. 再帰では、「代入」は(明示的には)現れない # 目的が実現されるまで、その作業を繰り返しする # 代入を繰り返し => 変数の値を、目的の値に近づけてゆく # <= 十分に近い(答えそのものになったら).. 繰り返しを終了 while 構文の応用 数値計算 (解析的発想:答えの近似値の精度を高めて行く) 解析的(厳密に「等号が成立する」=誤差を含まない答えを得る手段)に解けない場合でも、 近似的(誤差を含むかもしれない..)値を得る(数値的に解く) 例: sin(x) = 1 となる x を求めよ、 x = sin^{-1}(1) 二分方法 答えの範囲を半分半分にしてゆき、答えのある場所を探す 範囲は、1/2 になってゆくので、どんどん小さくなるが、 有限回しかできないと、区間の幅が残る => 幅 = 誤差 # 数値計算を利用する立場 # 誤差の有り無し、問題の解ける解けないをトレード # 誤差の大きさ、実行時間のトレード 数値積分 面積を求めるために、一度に求めるのではなく、 少しずつ、加えてゆく ( 求積法 ) # 数学 # ∫_a^b f(x) dx = F(b) - F(a) while 構文の考え方 変数の値に近似結果を入れ、 それを更新(近似度を高める..)事により、 より、精度の高い(答えに近い)値に変数の値を近づけてゆく 十分に近いなら、終了する ( 繰り返し条件 ) == for 構文とは 繰返しを記述する構文規則 ( cf. while ) for ( <初期化式>; <継続条件式>; <再初期化式> ) { <繰返し文> } # cf. # while ( <継続条件式> ) { <繰返し文> } 初期化式 : 最初に一度だけ、必ず行われる文 継続条件式 : 毎回、繰返し文の実行「前」に評価され これが偽の場合は終了(<繰り返し文>は実行されない)になる 繰返し文 : for 構文によって繰り返される命令 再初期化式 : <繰り返し文>の実行の「後」に毎回「実行」される 構文の実行状況 while ( <継続条件式> ) { <繰返し文> } <継続条件式> => 真 <繰返し文> <継続条件式> => 真 <繰返し文> .. <継続条件式> => 偽 終了 for ( <初期化式>; <継続条件式>; <再初期化式> ) { <繰返し文> } <初期化式> <継続条件式> => 真 <繰返し文> <再初期化式> <継続条件式> => 真 <繰返し文> <再初期化式> .. <継続条件式> => 偽 終了 for 構文と while 構文は、一方を他方の代わりに使える for 構文を利用すると、 「繰り返す」ための作業 繰り返し条件に含まれる変数 ( 制御変数 ) にかかわる記述 変数 => 初期化が必要 => <初期化式> 繰り返しなので、(制御変数を含む)条件式 => <継続条件式> 条件を終了させるために => 変数の値の更新 => <再初期化式> => for 構文では、 制御変数の処理が、一か所にまとめられるので (まとめておけば..) 繰り返しの様子が一目でわかる 「繰り返す」作業 の二つを分離できる インクリメント/デクリメント演算子 変数の値を 1 だけ増やしたり減らしたりする演算子 「++」: 変数を 1 だけ増やす => 「i++」 は、「i = i + 1 」と同じと思って良い 「--」: 変数を 1 だけ減らす => 「i--」 は、「i = i - 1 」と同じと思って良い for 構文では、<再初期化式> の所で、よく利用されている 「for ( i = 0; i < n; i++ ) { .. }」は、 「.. を n 回繰り返す」というイデオムになっている == 「繰り返し」 手段 a) 代入を使わない 関数の再帰的定義 b) 代入を使う while 構文 for 構文 a) と b) の使い分け 数学的に考えたい ( <= 数学の知識を利用してプログラムを書きたい ) => 再帰の方がよい (関数型言語的表現) 効率を高めたい / 変数の代入による手続型言語的表現 => while / for == switch 構文 条件分岐 ( if 構文 ) if 構文 => 二分岐 ( 条件が成立 / 不成立 ) switch 構文 => 一つの式の値が、複数の候補のどれかに一致する => 多分岐 => if 構文を複雑に組み合わせれば、 (ほぼ) switch 構文と同様な機能が実現です switch - case 構文 機能 多分岐構文 ( if 文は 2 分岐だが switch は n 分岐 ) 構文 ::= switch ( <式> ) { } ::= の繰返し ::=