Download - forやめろ -- LL Diver 2014 LT枠
![Page 1: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/1.jpg)
forやめろ
esehara shigeo
![Page 2: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/2.jpg)
お前誰だ
![Page 3: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/3.jpg)
esehara shigeo趣味:言語いじりFizzBuzzの研究
数論・数理論理学←New!!PythonistaClojuren
![Page 4: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/4.jpg)
![Page 5: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/5.jpg)
最初に結論を
![Page 6: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/6.jpg)
時代はStaticおじさん
からforおじさんへ
![Page 7: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/7.jpg)
では始めます
![Page 8: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/8.jpg)
FizzBuzzではない新しい採用試験のご案内
![Page 9: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/9.jpg)
1から100の整数を出力してください
ただし5つの
異なる方法を用いて
![Page 10: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/10.jpg)
1から100の整数を出力してください
ただし5つの異なる方法を用いて
![Page 11: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/11.jpg)
そもそも「繰り返し」とは何か問題
あるブロックを
ある条件の間
何度も実行すること
![Page 12: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/12.jpg)
ちょっとまて繰り返しって
そんな自明なことだっけ?
![Page 13: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/13.jpg)
「繰り返し」における再帰と反復
● ある種の問題の解は再帰を使うと容易に定式化できる
● ある種の問題に対する反復解は、再帰解ほど自明ではない
● 一般に、反復解は再帰解より効率的である(関数呼び出しのオーバヘッドのため)。
![Page 14: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/14.jpg)
既に2パターンあるじゃねえか!!!
![Page 15: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/15.jpg)
だからこそ、繰り返しの知見が
必要になる
![Page 16: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/16.jpg)
最も有名な反復の方法
![Page 17: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/17.jpg)
GOTO
![Page 18: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/18.jpg)
GOTOが使える言語といえば
● C言語● CSH● BASIC● FORTRAN● GO
![Page 19: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/19.jpg)
NO!そんなの
メインじゃない!
![Page 20: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/20.jpg)
PHP
![Page 21: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/21.jpg)
PHPにおけるGOTO
<?php$a = 0;
incr_loop:
$a++;echo $a . "\n";if ($a < 100) goto incr_loop;
![Page 22: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/22.jpg)
GOTOでわかること
● GOTOを使った繰り返しとは、「ある条件のときに、あるラベルがある場所に戻る」ことである、と説明ができる
![Page 23: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/23.jpg)
GOTOにおける反復のポイント
● ラベルの前で変数を初期化● 条件を満たしているなら任意のラベルに移動
● 変数に新しい値を代入する
![Page 24: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/24.jpg)
****における反復のポイント
● ブロックの前で変数を初期化● 条件を満たしているならブロックの最初に戻る
● 変数に新しい値を代入する
![Page 25: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/25.jpg)
while
![Page 26: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/26.jpg)
PythonにおけるWhile
a = 0
while a < 100: a += 1 print(a)
![Page 27: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/27.jpg)
whileなんて使わないでしょ?
いらないよね(^ー^)
![Page 28: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/28.jpg)
GO
![Page 29: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/29.jpg)
Goにおけるwhileっぽいアレpackage main
import "fmt"
func use_for(b int) {a := 0for ; a < b; {
a += 1fmt.Println(a)
}}
func main() {use_for(100)
}
![Page 30: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/30.jpg)
ここで皆さんにお知らせです
![Page 31: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/31.jpg)
テスト書けクソども
![Page 32: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/32.jpg)
ついでなのでテストpackage main
func ExampleUseFor() {
use_for(5) // Output:
// 1// 2// 3// 4// 5
}
![Page 33: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/33.jpg)
whileからわかること
● 「あるラベルからGOTOで飛ぶ範囲」を「ブロック」としてまとめることができれば、「ブロックの繰り返し」として説明できる
![Page 34: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/34.jpg)
whileにおける反復のポイント
● 変数を初期化● 条件を満たしているならwhileのブロックの最初に戻る
● 変数に新しい値を代入する
![Page 35: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/35.jpg)
あれ?ブロックを関数でまとめちゃえば
いいんじゃないの?
![Page 36: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/36.jpg)
再帰
![Page 37: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/37.jpg)
**における繰り返しのポイント
● 初期値を関数の引数に● 条件を満たしていないなら自身をもう一度呼ぶ
● 自身を呼ぶときに新しい値を渡す
![Page 38: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/38.jpg)
Schemeにおける再帰
(define (ref-loop i j) (if (<= i j)
(begin(print i) (ref-loop (+ i 1) j))))
(ref-loop 1 100)
![Page 39: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/39.jpg)
再帰からわかること
● 「ブロック」としてまとめることができる、ということはその「ブロック」自体を関数にすることが可能である
![Page 40: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/40.jpg)
〔再掲〕 関数における繰り返しのポイント
● 初期値を関数の引数に● 条件を満たしていないなら自身をもう一度呼ぶ
● 自身を呼ぶときに新しい値を渡す
![Page 41: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/41.jpg)
理論的には
● プログラミングコード、それ自体も実は一つの大きなブロックとしてとらえることができる(例:テンプレートエンジン)
![Page 42: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/42.jpg)
**における再帰のポイント
● 初期値をオプション引数に● 条件を満たしていないなら自身(スクリプ
ト)をもう一度実行する● 自身を実行するときに新しい引数を渡
す
![Page 43: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/43.jpg)
Bash
![Page 44: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/44.jpg)
話は戻ります
![Page 45: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/45.jpg)
この時期の学生
![Page 46: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/46.jpg)
「プログラムにおけるfor文が難しいよぉ」
![Page 47: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/47.jpg)
俺も正直難しいと思っている
![Page 48: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/48.jpg)
forがやっていることの面倒くささ
● 変数を初期化● 繰り返し
○ ブロックの最初に戻る○ 条件を満たした場合はブロックを実行
● 変数に新しい値を代入する
![Page 49: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/49.jpg)
JavaScriptによる例
for (var i = 0; i <= 100; i++) { console.log(i);}
![Page 50: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/50.jpg)
Pythonでwhileでforを書き直すと
a = 0
while True: if a >= 100: break a += 1 print(a)
![Page 51: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/51.jpg)
三つのことを同時に
考慮しないとダメ
![Page 52: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/52.jpg)
forがやっていることの面倒くささ
● 変数を初期値とは?● 条件を満たす、とは?● 変数に新しい値を代入する、とは?
![Page 53: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/53.jpg)
プログラミングできない駄目な妹(妄想上)はこういうわけですよ
![Page 54: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/54.jpg)
ふええ……難しいよお><
![Page 55: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/55.jpg)
だったらこれでいいよねお兄ちゃん……
![Page 56: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/56.jpg)
***による繰り返し
● 任意の配列Xを用意する● Xの要素yに対して、任意のブロックおよ
び関数を適用する● これを全ての要素に適用する過程を使
えば、繰り返しとなる
![Page 57: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/57.jpg)
each
![Page 58: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/58.jpg)
Rubyによる例
(1..100).each do |v| puts vend
![Page 59: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/59.jpg)
eachからわかること
● ブロックを関数などの一つの実行単位としてまとめることができるなら、それを「ある集合」の「要素」に適用させていく過程、という書き換えることができる
![Page 60: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/60.jpg)
博士の知っ得豆知識
「この配列の要素を取り出すインターフェイスをイテレーターっぽく共通化すれば、任意のオブジェクトを配列のようにあつかえるのじゃ」
「お前誰だよ」
![Page 61: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/61.jpg)
ふええ……配列に対して二乗した結果が欲しいですぅ……
![Page 62: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/62.jpg)
配列操作に対して安易にfor使うな
● 超べんりforブロックに成長(一ブロック1000行!)
● 並列化したいとき、切り分けが発生する● テストが配列に対するものになる
![Page 63: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/63.jpg)
map
![Page 64: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/64.jpg)
Pythonによる例
from __future__ import print_function
map(print, range(101))
![Page 65: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/65.jpg)
mapからわかること
● それを「ある集合」の「要素」に適用させていく過程を行うことで、「要素それぞれに対して関数を適用した結果」となるように書いた方が、可読性があがる
![Page 66: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/66.jpg)
そんなこと考えてるの頭でっかちな
ウェッブケーでしょ(笑)
![Page 67: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/67.jpg)
Java8Stream API
![Page 68: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/68.jpg)
最後に結論を
![Page 69: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/69.jpg)
Q.for使ってもいい時は
ありますか?
![Page 70: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/70.jpg)
私見・forを使わないほうがいいとき
● 配列を加工した結果として、新しい配列が必要な場合
● ほかの表現のほうがより適している場合(whileとかeachとかあるでしょ)
![Page 71: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/71.jpg)
私見・forを使うほうがいいとき
● forでパフォーマンスを改善できる場合
● 言語的な仕様によって、上記アプローチが使えないとき
![Page 72: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/72.jpg)
forを使っていいとき・巨大数を作る
![Page 73: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/73.jpg)
最後に改めて
![Page 74: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/74.jpg)
人間の考えを機械に合わせる
のではなく機械のほうが
人間にあわせていく
![Page 75: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/75.jpg)
過去の慣習にあわせるのではなく
未来の進歩へ変化していく
![Page 76: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/76.jpg)
時代はStaticおじさん
からforおじさんへ
![Page 77: forやめろ -- LL Diver 2014 LT枠](https://reader033.vdocuments.net/reader033/viewer/2022051208/5471d8a0b4af9fa90a8b4c8f/html5/thumbnails/77.jpg)
ありがとうございました