Slide 1

Slide 1 text

逆ポーランド記法入門してみた 2018/08/03 Kyoto.LT#21 石田 智宏 / geckour (フリーター a.k.a. インターン)

Slide 2

Slide 2 text

自己紹介 ● 石田 智宏 (ISHIDA Tomohiro) a.k.a. セロリン ● モラトリアム終了間際 (Androidアプリインターン) ● 数学とかアルゴリズムとか苦手

Slide 3

Slide 3 text

そうだ、電卓作ろう ● ToDoアプリと並ぶ試作アプリ代表格、電卓 (ソースはない) ● ちゃちゃっと簡単に作れそう

Slide 4

Slide 4 text

そうだ、電卓作ろう ● ToDoアプリと並ぶ試作アプリ代表格、電卓 (ソースはない) ● ちゃちゃっと簡単に作れそう ● 油断するとすぐ複雑化するレイアウト ● やっぱ数式入力して計算させたい ● 数式解析のためのアルゴリズムが登場

Slide 5

Slide 5 text

そうだ、電卓作ろう ● 意外とめんどくさいのでは…? ● 少しでも楽したい!

Slide 6

Slide 6 text

ところで RPNって知ってますか?

Slide 7

Slide 7 text

RPN (逆ポーランド記法) "逆ポーランド記法(ぎゃくポーランドきほう、英語: Reverse Polish Notation, RPN) は、数式やプログラムの記法の一種。演算子を被演算子の後にすることから、 後置記法 (Postfix Notation) とも言う。" (Wikipedia)

Slide 8

Slide 8 text

RPN (逆ポーランド記法) "逆ポーランド記法(ぎゃくポーランドきほう、英語: Reverse Polish Notation, RPN) は、数式やプログラムの記法の一種。演算子を被演算子の後にすることから、 後置記法 (Postfix Notation) とも言う。" (Wikipedia) ● 訳:コンピュータで扱いやすい数式とかの記法だよ ● 例:(2 + 5) * (13 * 4) → 2 5 + 13 4 + * ● なんか良さそう!

Slide 9

Slide 9 text

やってみようRPN ● まずはRPN変換器を作るよ ○ 式を要素毎に分割してリストを作成 ■ 例:5 + 2 * 3 → [5, +, 2, *, 3] ○ 式の要素の重み (優先順位) を決める ■ 例:数字 → 0 *, / → 1 +, - → 2

Slide 10

Slide 10 text

やってみようRPN ● まずはRPN変換器を作るよ ○ 重みに応じて並べ替え (スタックを利用する) ■ 括弧は特別 ● 右括弧が出てきたらスタックから左括弧を探す ● 見つかった左括弧から右括弧で挟まれる要素を全てスタックに追加 ■ スタックのトップと今の要素の重みを比較 ● スタックのトップの方が優先度高 → スタックからポップして結果リストに追加 ● 今の要素の方が優先度高 → 今の要素をスタックに追加 ■ 式リストの要素全てに繰り返す ■ 最後にスタックの内容を逆順で全て結果リストに追加

Slide 11

Slide 11 text

やってみようRPN ● まずはRPN変換器を作るよ ○ あれ、結局めんどくさくね …?

Slide 12

Slide 12 text

やってみようRPN ● 次にRPN解析器(計算機)を作るよ ○ さっき作ったリストを順番に回していく ○ スタックを利用する ■ 数値 ● 問答無用でスタックにプッシュ ■ その他演算子 ● 演算に必要な数値の数だけスタックからポップ ● 演算実行 ● 演算結果をスタックにプッシュ

Slide 13

Slide 13 text

やってみようRPN ● 次にRPN解析器(計算機)を作るよ ○ こっちは単純明快だった!

Slide 14

Slide 14 text

DEMO

Slide 15

Slide 15 text

まとめ ● RPN、書いてしまえば計算簡単 ● 書く (変換する) のは結構頭使う ● シンプルな分拡張性は高い ● 要素の構造化で複雑な計算にも対応可

Slide 16

Slide 16 text

Fin.