Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
四則演算の計算結果を返すプログラムを書きながら学習とは何かについて考える
Search
YuheiNakasaka
June 03, 2026
Technology
97
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
四則演算の計算結果を返すプログラムを書きながら学習とは何かについて考える
LT資料
YuheiNakasaka
June 03, 2026
More Decks by YuheiNakasaka
See All by YuheiNakasaka
エンジニアリングマネージャーの仕事
yuheinakasaka
0
200
サラリーマンソフトウェアエンジニアのキャリア
yuheinakasaka
55
26k
LLMでコードレビューする際の自分用環境を整える
yuheinakasaka
0
360
AIプログラミング雑キャッチアップ
yuheinakasaka
25
9.7k
Rubyに(ちょっと)コントリビュートできた話
yuheinakasaka
2
370
Other Decks in Technology
See All in Technology
AI Driven AI Governance
pict3
0
330
Compose 新機能総まとめ / What's New in Jetpack Compose
yanzm
0
160
証券システムを10年Scalaで作り続けるということ - 関数型まつり2026
krrrr38
3
840
完全自律ロボットを作りたくて、先に開発を自律させた話(ROS Japan UG #63 LT)
rryz09
0
500
Claude Code公式skillで 自分の仕事を少しずつ手放そう!(Claude Code開発ノウハウ大公開スペシャル by クラスメソッド)
kaym
1
280
ゼロをイチにする仕事が終わったあと
smasato
0
340
地域 SRE コミュニティ最前線 / SRE NEXT 2026 Discussion Night Track C
muziyoshiz
0
210
世界、断片、モデル。そして理解
ardbeg1958
1
110
Road to SRE NEXTの今までとこれから
hiroyaonoe
0
310
SRE Next 2026 何でも屋からの脱却
bto
0
630
Foxgloveについて 実際にExtensionを開発して公開するまでの話 / About Foxglove: The Story of Developing and Releasing an Extension
ry0_ka
0
210
凡エンジニアがこの先生きのこるためには。〜TypeScript完全に理解したい〜
alchemy1115
2
170
Featured
See All Featured
The Invisible Side of Design
smashingmag
301
52k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
210
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Mind Mapping
helmedeiros
PRO
1
280
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Fireside Chat
paigeccino
42
4k
Abbi's Birthday
coloredviolet
3
8.6k
For a Future-Friendly Web
brad_frost
183
10k
Transcript
四則演算の計算結果を返すプログラムを書きながら 学習とは何かについて考える Yuhei Nakasaka 1
四則演算の式を受け取って その計算結果を返すプログラム書けますか? 例: 1+2*3 => 7 2
楽勝〜〜 eval('1+2*3') 3
条件 文字列 s は、非負整数・空白・演算子 + - * / だけからなる有効な式である s
を評価して結果を返せ * / は通常通り優先し、整数除算は 0 方向に切り捨てる 1 <= s.length <= 3 * 10^5 eval などの式評価関数は禁止 https://leetcode.com/problems/basic-calculator-ii/ 4
再帰下降構文解析のパーサーを書けば良いのでは どうやって書くんだっけ? ぼんやりとしか記憶していない → 調べる 5
再帰下降構文解析とは 文法規則ごとに関数を用意する トップダウン構文解析 各関数が、対応する非終端記号を処理する 書いたプログラムの構造が文法の構造に近くなる 実装的には優先順位が低いものから順に再帰的に降って下から順に計算する感じ https://en.wikipedia.org/wiki/Recursive_descent_parser 6
四則演算のBNF書くか〜 どうやって書くんだっけ? ぼんやりとしか記憶していない → 調べる 7
BNF(バッカスナウア)記法とは Backus–Naur Form の略 記号の書き換え規則を用いて文字列の構造を定義する仕組み プログラミング言語やプロトコルの構文定義で使われる <expr> ::= <term> [
('+'|'-') <term> ]* <term> ::= <number> [ ('*'|'/') <number> ]* <number> ::= '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' https://en.wikipedia.org/wiki/Backus–Naur_form 8
再帰下降構文解析で書いてみた結果 https://gist.github.com/YuheiNakasaka/e6574b98653bb1d0548fb4583ed1f205 9
というかこんなことしなくても もっと雑に解ける方法あるのでは... 10
四則演算のプログラムといえば 逆ポーランド記法!! 逆ポーランド記法に変換すれば良いのでは 11
逆ポーランド記法とは 演算子を、対応するオペランドの 後ろ に置く記法 1 + 2 * 3 は
1 2 3 * + 左から読み、数値はスタックに積み、演算子が来たら計算する 1 2 3 * + push 1 push 2 push 3 * => 2 * 3 = 6 + => 1 + 6 = 7 https://en.wikipedia.org/wiki/Reverse_Polish_notation 12
と言っても 中置記法を逆ポーランド記法に変換するの面倒そう 13
操車場アルゴリズムというのがある ダイクストラ先生 が考案した、式を構文解析するためのアルゴリズム 中置記法から、逆ポーランド記法や AST を生成できる(らしい) 演算子スタックを使い、優先順位が高いものから出力に送る input: 1 +
2 * 3 output: 1 2 3 * + https://en.wikipedia.org/wiki/Shunting_yard_algorithm 14
実際のコード https://gist.github.com/YuheiNakasaka/62e96c088fa12c30ad6b46b1837d8d7a これで提出 15
通った 16
では模範解答をチェック! 17
模範解答 https://gist.github.com/YuheiNakasaka/0bcfb8c124ad852dccf79a5e41ddfc73 18
全然違う解法... スタックを一つ使うだけ...だと 19
模範解答の考え方 * / だけ、その場で計算する + n は n をスタックに積む /
- n は -n をスタックに積む * n は直前の値を取り出して掛ける / / n は直前の値を取り出して割る 最後にスタックを合計する 3 + 2 * 2 stack: [3] stack: [3, 2] stack: [3, 4] sum : 7 20
気づき 21
人間は知ってる道具で課題解決しようとする ハンマーしか持っていなければ、すべてのものが釘に見える(ハンマーを持ってる と釘を探したくなる) 技術選定や設計などあらゆる意思決定でも言えること(学んだばかりのデザインパ ターンで実装したくなる、など) 様々な選択肢を持っていないと最適な選択ができない 22
最適な答えが全てではない 最適な答えを得ることは大事だが、そこに辿り着くまでの過程は無駄だったか 再起下降構文/BNF/逆ポーランド記法/操車場アルゴリズムなど。寄り道によって 様々なアプローチを再学習できた。 23
AIと学習機会 AIを使うと最適な答えがすぐに手に入る 最適な答えが手に入るのは便利だが、その過程で本来得られたかもしれない新た な学びの機会を失っているのではないか 本当にそれでいいのか 24
もっと間違って寄り道しよう 自分のプログラマ人生を振り返ってみると、いつも何か学びを多く得られたのは 答えを得た時ではなく、答えを得るまでの道中だった気がする ゴールに辿り着くまでの試行錯誤こそが学習の肝なのではないか 成長のために必要な、大切な寄り道の機会をAIに奪われるのは勿体無い 25
ただし、あくまで学習という観点の話 業務ではAIが簡単にやってしまえることはAIにやらせて人間はより複雑な判断や創 造的な仕事に時間を使うべき AIを使うなというわけではなく、学習という観点で大切なのは寄り道の中にある のではないか、という話です。 AIで仕事が出来るからといって、自分が賢くなっているわけではない もちろんAIを使って学習を加速させることもできる(が、これはまた別の機会で) 26
終わり 27
参考資料 LeetCode 227. Basic Calculator II: https://leetcode.com/problems/basic-calculator-ii/description/ Recursive descent parser:
https://en.wikipedia.org/wiki/Recursive_descent_parser BNF notation for syntax, W3C: https://www.w3.org/Notation.html バッカス・ナウア記法: https://ja.wikipedia.org/wiki/バッカス・ナウア記法 Reverse Polish notation: https://en.wikipedia.org/wiki/Reverse_Polish_notation Shunting yard algorithm: https://en.wikipedia.org/wiki/Shunting_yard_algorithm Law of the instrument: https://en.wikipedia.org/wiki/Law_of_the_instrument 28