基 本 情 報 第 2回 2013/4/23 情 報 、通 信 、制 御 に関 する理 論 例 題 1:逆 ポーランド記 法 後 置 表 記 法 (逆 ポーランド表 記 法 )では,例 えば,式 Y=(A-B)×C を YAB -C×= と表 現 する。 次 の式 を後 置 表 記 法 で表 現 したものはどれか。 Y=(A+B)×(C-(D÷E)) YAB+C-DE÷×= ア YAB+CDE÷-×= YAB+EDC÷-×= YBA+CD-E÷×= イ ウ エ 例題2:状態遷移表 次 の表 は,文 字 列 を検 査 するための状 態 遷 移 表 である。検 査 では,初 期 状 態 を a とし,文 字 列 の検 査 中 に状 態 が e になれば不 合 格 とする。 解 答 群 で示 される文 字 列 のうち,不 合 格 となるものはどれか。ここで,文 字 列 は左 端 から検 査 し,解 答 群 中 の△は空 白 を表 す。 +0010 -1 12.2 9.△ 1 ア イ ウ エ 例題3:BNF 次 の規 則 から生 成 することができる式 はどれか。 〔規 則 〕 <式 > ::=<変 数 >|(<式 >+<式 >)|<式 >*<式 > <変 数 > ::=A|B|C|D A+(B+C)*D ア (A+B)+(C+D) イ (A+B)*(C+D) ウ (A*B)+(C*D) エ 2 解説1:逆 ポーランド表 記 法 スタック、キュー、逆ポーランド記法 キューとスタック ──┐ │ : │↓ │ ├────┤ 11│データ5│ ├────┤ 12│データ4│ ├────┤ 13│データ3│ ├────┤ 14│データ2│ ├────┤ 15│データ1│ ├────┤ : │ ││ Push ──┐ ┌─→ Pop │ │ : │↓ ││ ├────┤ 11│データ5│ ├────┤ 12│データ4│ ├────┤ 13│データ3│ ├────┤ 14│データ2│ ├────┤ 15│データ1│ ├────┤ : │ │ │ └─→ キュー FIFO スタック LIFO 配列の特殊な構造に、キューとスタックがあります。 キューは、FIFO(First In First Out:先入れ先出し)方式で、待ち行列ともいいます。 プリンタへのスプールによる出力処理やデータを入力された順番通りに処理するとき などに用いられます。 それに対して、スタックは、LIFO(Last In First Out:後入れ先出し)方式です。新しい データを入れる(Push)と、それまでのデータが下に押し下げられ、取り出すとき(Pop) ときは、1番上のデータが取り出され、2番目以降のデータが上に押し上げられます。 スタックの利用 コンピュータでは、スタックが広い分野で用いられています。 3 CPUでは、命令を実行するためのレジスタの一つとして、スタックポインタというレジスタを 用いています。 コンパイラが数式を命令に展開する技法の一つに「逆ポーランド記法」がありますが、これ にはスタックが重要な役割を持っています(これに関しては後述します)。 再帰呼び出しを実現するには、スタックが用いられます。 複雑な探索問題や最適化問題では、分枝限定法がとられますが、その中間結果を記録す る手段(バックトラッキング)として、スタックが用いられます。 逆ポーランド記法との関係 逆ポーランド記法 数学の一般的な記法での数式 A+B×C を計算するには、発生順序により「(A+B)× C」とするのは誤りです。日本語では「AにBにCを×したものを+する」ことになりますが、 その順に「ABC×+」と記述する記法を逆ポーランド記法といいます。 もう少し複雑な例にして、数式を逆ポーランド記法にする手順を説明します。 数式 A+B×(C+D)+E は、演算の優先順位を( )で明示すれば、 ((A+(B×(C+D)))+E) になります。 最も深い( )から、数式を逆ポーランド記法に置き換えていきます。 ( (A+(B×(C+D)) )+E) └─①─┘ CD+ └───②───┘ BCD+× └─────③─────┘ ABCD+×+ └─────④─────────┘ ABCD+×+E+ となり、逆ポーランド記法の ABCD+×+E+ になります。 なお、これを木構造(演算木)を用いて表現することもできます。 練習問題 問題1: (A+B)×(C-D) → AB+CD-× 問題2: A/(B-C)+D 4 → ABC-/D+ スタックによる計算方法 数学での記法を逆ポーランド記法に変換すれば、スタックを利用して簡単に計算すること ができます。 そのルールは、次の通りです。 逆ポーランド記法で記述した数式を左から順番に処理する。スタックは空である。 数値ならば、スタックに Push する 演算子ならば、 スタックの1番上の数値を Pop して、その数値をXとする。 新しくスタックの1番上にきた数値をYとして、YにXを演算する。 その結果をYに代入する。 数式がなくなったとき、スタックには唯一の数値が残っており、それが数式の結果であ る。 このように、逆ポーランド記法では、+×や( )などの優先順位を考慮する必要がなく、 式の解釈が簡単になり、スタック操作だけで行えるので、初期の電卓では逆ポーランド記 法の順に入力するものもありました。また、コンパイラで数式を解釈するときにも利用されて います。 例題 「ABC/-」を例にして説明します。 Step1:Aを Push する。 Step2:Bを Push する。 Step3:Cを Push する。 Step4:/になった。Cが Pop され、スタックの最上段がBになる。 最上段の値を B/C の計算結果に置き換える。 Step5:-になった。B/C が Pop され、スタックの最上段がAになる。 最上段の値を A-(B/C) の計算結果に置き換える。 数式がなくなったので、計算結果は A-(B/C) となる。 スタックの状況は、次のようになります。 Step1 Step2 Step3 Step4 Step5 A B C / - ┌───┬───┬───┬───┬──────┐ 1 │ A │ B │ C │B/C│A-(B/C)│ └───┼───┼───┼───┼───┬──┘ 2 │ A │ B │ A │ └───┼───┼───┘ 3 │ A │ └───┘ 5 └ 計算結果 <例 題 1の解 説 > 通 常 の式 を、逆 ポーランド表 記 法 で表 現 するための基 本 は、 A+B を AB+ で表 すことです。これと一 回 使 った演 算 子 は 2 度 使 わないことに注 意 して、普 通 に計 算 式 を解 くのと同 じ要 領 で行 っていくことで逆 ポーランド表 記 法 の式 に なります。 Y=(A+B)×(C-(D÷E))を、一 つずつ順 番 に逆 ポーランド表 記 法 に変 換 して いきましょう。 1. まず括 弧 内 の A+B と D÷E を変 換 します。 Y=AB+×(C-DE÷) 2. 次 にもう一 つの括 弧 内 の(C-DE÷)を変 換 します。 Y=AB+×CDE÷- この時 「DE÷」を一 つの項 として考 えると、「C」-「DE÷」⇒ CDE÷-となること を理 解 しやすいかと思 います。 3. 次 に右 辺 でまだ演 算 をしていない、"×"の左 側 と右 側 で演 算 します。先 程 と同 様 に「AB+」×「CDE÷-」⇒ AB+CDE÷-×と考 えます。 Y=AB+CDE÷-× 4. 最 後 に 左 辺 と右 辺 を"="で演 算 して逆 ポーランド表 記 法 への変 換 が 完 了 します。 YAB+CDE÷-×= したがって答 えは、「イ」となります。 通 常 の式 から、逆 ポーランド表 記 法 への変 換 はそれほど難 しくありませんが、 その逆 (逆 ポーランド⇒ 普 通 の式 )は、迷 ってしまう人 もいるのではないでしょう か。今 後 も出 題 される可 能 性 がありますので押 さえておきたいですね。 <例 題 2の解 説 >:状 態 遷 移 +0010 c(符 号 )→b(数 字 )→b(数 字 )→b(数 字 )→b(数 字 )と遷 移 するので問 題 ありま せん。 -1 c(符 号 )→b(数 字 )と遷 移 するので問 題 ありません。 6 12.2 b(数 字 )→b(数 字 )→d(小 数 点 )と遷 移 し、現 在 の状 態 が d であり次 の文 字 が 数 字 であるので e に遷 移 します。したがって不 合 格 となります。 9.△ b(数 字 )→d(小 数 点 )→a(空 白 )と遷 移 するので問 題 ありません。 <例 題 3の解 説 >BNF 問 題 文 のような構 文 定 義 法 は、BNF(Backus-Naur Form,バッカス・ナウア 記 法 )と呼 ばれ、XML をはじめ多 くのプログラム言 語 の構 文 定 義 に用 いられ ています。 BNF で使 われている各 記 号 は、「::=」が左 辺 と右 辺 の区 切 り,「|」が or(ま たは),「<>」は非 終 端 記 号 を表 しています。 各 式 を規 則 に従 って変 換 していき、最 後 に<式 >の形 になれば規 則 どおりであ ることになります。 A+(B+C)*D A+(B+C)*D→<式 >+<式 > (A+B)+(C+D) (A+B)+(C+D)→<式 >+<式 > (A+B)*(C+D) 正 しい。 (A+B)*(C+D)→<式 >*<式 >→<式 > (A*B)+(C*D) (A*B)+(C*D)→(<式 >)*(<式 >) 7 第2回 小 テ ス ト (2013/4/24) 学番 氏名 問題1: A= 1, B= 3, C= 5, D= 4, E= 2 の と き , 逆 ポ ー ラ ン ド 表 記 法 で 表 現 さ れ た 式 AB+ CDE/ - * の 演 算 結 果 は ど れ か 。 -12 ア、 2 イ、 12 ウ、 14 エ 正解 ウ 解説 逆 ポーランド記 法 で表 現 された計 算 式 には計 算 順 番 があります。以 下 のよう にして解 いてみましょう。 まず演 算 子 (+-*/)の左 側 にある 2 つの項 に注 目 します。この計 算 式 の場 合 で は、+の左 にある AB と、/の左 側 にある DE です。 まず最 初 に、この演 算 子 と 2 つの項 を計 算 します。 AB+ =1+3=4, DE/=4÷2=2 計 算 式 をまとめると 4C2-* になります。 再 び演 算 子 (+-*/)の左 側 にある 2 つの項 に注 目 し計 算 します。今 回 は"-"の 左 にある C と 2 です。 C2- =5-2=3 計 算 式 をまとめると 43* になります。 再 び演 算 子 (+-*/)の左 側 にある 2 つの項 に注 目 し計 算 します。最 後 に残 った 43*です。 43* =12 よって答 えは 12 になります。 問題2: 次 の状 態 遷 移 表 をもつシステムの状 態 が S1 であるときに,信 号 を t1,t2,t3, t4,t1,t2,t3,t4 の順 に入 力 すると,最 後 の状 態 はどれになるか。ここで,空 欄 は状 態 が変 化 しないことを表 す。 8 S1 ア、 S2 イ、 ウ、 S3 S4 エ 正解 ア 解説 [状 態 [状 態 [状 態 [状 態 [状 態 [状 態 [状 態 [状 態 1. 2. 3. 4. 5. 6. 7. 8. S1,入 力 S1,入 力 S3,入 力 S4,入 力 S2,入 力 S3,入 力 S2,入 力 S2,入 力 t1] t2] t3] t4] t1] t2] t3] t4] 空 欄 なので変 化 しません。 S3 に遷 移 します。 S4 に遷 移 します。 S2 に遷 移 します。 S3 に遷 移 します。 S2 に遷 移 します。 空 欄 なので変 化 しません。 S1 に遷 移 します。 したがって最 後 の状 態 は「S1」になります。 問題3: 次 の BNF で定 義 されるビット列 S であるものはどれか。 <S> ::= 01|0<S>1 000111 ア、 正解 解説 9 ア 010010 イ、 010101 ウ、 011111 エ BNF(Backus-Naur Form,バッカス・ナウア記 法 )は、コンピュータ言 語 の構 文 などを記 述 するために使 用 される表 記 法 で、プログラム言 語 ALGOL(アル ゴル)の文 法 を表 現 するためにジョン・バッカスなどによって考 案 されました。 「::=」は等 号 「|」は論 理 和 (OR)を表 しているので、問 題 文 の BNF は「<S>は、 01 または 0<S>1 である」と解 釈 します。また<S>は両 辺 に表 れているので再 帰 的 に定 義 されていることになります。 <S>に右 辺 のいずれかを代 入 していくと、 <S>→0<S>1→00<S>11→000111 というように定 義 できることができるのは「000111」とわかります。 10
© Copyright 2024 Paperzz