逆ポーランド記法入門してみた@Kyoto.LT_21
by
geckour
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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.