forやめろ -- ll diver 2014 lt枠

77
for やめろ esehara shigeo

Upload: esehara-shigeo

Post on 22-Nov-2014

12.782 views

Category:

Software


1 download

DESCRIPTION

LL Diver 2014

TRANSCRIPT

Page 1: forやめろ -- LL Diver 2014 LT枠

forやめろ

esehara shigeo

Page 2: forやめろ -- LL Diver 2014 LT枠

お前誰だ

Page 3: forやめろ -- LL Diver 2014 LT枠

esehara shigeo趣味:言語いじりFizzBuzzの研究

数論・数理論理学←New!!PythonistaClojuren

Page 4: forやめろ -- LL Diver 2014 LT枠
Page 5: forやめろ -- LL Diver 2014 LT枠

最初に結論を

Page 6: forやめろ -- LL Diver 2014 LT枠

時代はStaticおじさん

からforおじさんへ

Page 7: forやめろ -- LL Diver 2014 LT枠

では始めます

Page 8: forやめろ -- LL Diver 2014 LT枠

FizzBuzzではない新しい採用試験のご案内

Page 9: forやめろ -- LL Diver 2014 LT枠

1から100の整数を出力してください

ただし5つの

異なる方法を用いて

Page 10: forやめろ -- LL Diver 2014 LT枠

1から100の整数を出力してください

ただし5つの異なる方法を用いて

Page 11: forやめろ -- LL Diver 2014 LT枠

そもそも「繰り返し」とは何か問題

あるブロックを

ある条件の間

何度も実行すること

Page 12: forやめろ -- LL Diver 2014 LT枠

ちょっとまて繰り返しって

そんな自明なことだっけ?

Page 13: forやめろ -- LL Diver 2014 LT枠

「繰り返し」における再帰と反復

● ある種の問題の解は再帰を使うと容易に定式化できる

● ある種の問題に対する反復解は、再帰解ほど自明ではない

● 一般に、反復解は再帰解より効率的である(関数呼び出しのオーバヘッドのため)。

Page 14: forやめろ -- LL Diver 2014 LT枠

既に2パターンあるじゃねえか!!!

Page 15: forやめろ -- LL Diver 2014 LT枠

だからこそ、繰り返しの知見が

必要になる

Page 16: forやめろ -- LL Diver 2014 LT枠

最も有名な反復の方法

Page 17: forやめろ -- LL Diver 2014 LT枠

GOTO

Page 18: forやめろ -- LL Diver 2014 LT枠

GOTOが使える言語といえば

● C言語● CSH● BASIC● FORTRAN● GO

Page 19: forやめろ -- LL Diver 2014 LT枠

NO!そんなの

メインじゃない!

Page 20: forやめろ -- LL Diver 2014 LT枠

PHP

Page 21: forやめろ -- LL Diver 2014 LT枠

PHPにおけるGOTO

<?php$a = 0;

incr_loop:

$a++;echo $a . "\n";if ($a < 100) goto incr_loop;

Page 22: forやめろ -- LL Diver 2014 LT枠

GOTOでわかること

● GOTOを使った繰り返しとは、「ある条件のときに、あるラベルがある場所に戻る」ことである、と説明ができる

Page 23: forやめろ -- LL Diver 2014 LT枠

GOTOにおける反復のポイント

● ラベルの前で変数を初期化● 条件を満たしているなら任意のラベルに移動

● 変数に新しい値を代入する

Page 24: forやめろ -- LL Diver 2014 LT枠

****における反復のポイント

● ブロックの前で変数を初期化● 条件を満たしているならブロックの最初に戻る

● 変数に新しい値を代入する

Page 25: forやめろ -- LL Diver 2014 LT枠

while

Page 26: forやめろ -- LL Diver 2014 LT枠

PythonにおけるWhile

a = 0

while a < 100: a += 1 print(a)

Page 27: forやめろ -- LL Diver 2014 LT枠

whileなんて使わないでしょ?

いらないよね(^ー^)

Page 28: forやめろ -- LL Diver 2014 LT枠

GO

Page 29: forやめろ -- LL Diver 2014 LT枠

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枠

ここで皆さんにお知らせです

Page 31: forやめろ -- LL Diver 2014 LT枠

テスト書けクソども

Page 32: forやめろ -- LL Diver 2014 LT枠

ついでなのでテストpackage main

func ExampleUseFor() {

use_for(5) // Output:

// 1// 2// 3// 4// 5

}

Page 33: forやめろ -- LL Diver 2014 LT枠

whileからわかること

● 「あるラベルからGOTOで飛ぶ範囲」を「ブロック」としてまとめることができれば、「ブロックの繰り返し」として説明できる

Page 34: forやめろ -- LL Diver 2014 LT枠

whileにおける反復のポイント

● 変数を初期化● 条件を満たしているならwhileのブロックの最初に戻る

● 変数に新しい値を代入する

Page 35: forやめろ -- LL Diver 2014 LT枠

あれ?ブロックを関数でまとめちゃえば

いいんじゃないの?

Page 36: forやめろ -- LL Diver 2014 LT枠

再帰

Page 37: forやめろ -- LL Diver 2014 LT枠

**における繰り返しのポイント

● 初期値を関数の引数に● 条件を満たしていないなら自身をもう一度呼ぶ

● 自身を呼ぶときに新しい値を渡す

Page 38: forやめろ -- LL Diver 2014 LT枠

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枠

再帰からわかること

● 「ブロック」としてまとめることができる、ということはその「ブロック」自体を関数にすることが可能である

Page 40: forやめろ -- LL Diver 2014 LT枠

〔再掲〕 関数における繰り返しのポイント

● 初期値を関数の引数に● 条件を満たしていないなら自身をもう一度呼ぶ

● 自身を呼ぶときに新しい値を渡す

Page 41: forやめろ -- LL Diver 2014 LT枠

理論的には

● プログラミングコード、それ自体も実は一つの大きなブロックとしてとらえることができる(例:テンプレートエンジン)

Page 42: forやめろ -- LL Diver 2014 LT枠

**における再帰のポイント

● 初期値をオプション引数に● 条件を満たしていないなら自身(スクリプ

ト)をもう一度実行する● 自身を実行するときに新しい引数を渡

Page 43: forやめろ -- LL Diver 2014 LT枠

Bash

Page 44: forやめろ -- LL Diver 2014 LT枠

話は戻ります

Page 45: forやめろ -- LL Diver 2014 LT枠

この時期の学生

Page 46: forやめろ -- LL Diver 2014 LT枠

「プログラムにおけるfor文が難しいよぉ」

Page 47: forやめろ -- LL Diver 2014 LT枠

俺も正直難しいと思っている

Page 48: forやめろ -- LL Diver 2014 LT枠

forがやっていることの面倒くささ

● 変数を初期化● 繰り返し

○ ブロックの最初に戻る○ 条件を満たした場合はブロックを実行

● 変数に新しい値を代入する

Page 49: forやめろ -- LL Diver 2014 LT枠

JavaScriptによる例

for (var i = 0; i <= 100; i++) { console.log(i);}

Page 50: forやめろ -- LL Diver 2014 LT枠

Pythonでwhileでforを書き直すと

a = 0

while True: if a >= 100: break a += 1 print(a)

Page 51: forやめろ -- LL Diver 2014 LT枠

三つのことを同時に

考慮しないとダメ

Page 52: forやめろ -- LL Diver 2014 LT枠

forがやっていることの面倒くささ

● 変数を初期値とは?● 条件を満たす、とは?● 変数に新しい値を代入する、とは?

Page 53: forやめろ -- LL Diver 2014 LT枠

プログラミングできない駄目な妹(妄想上)はこういうわけですよ

Page 54: forやめろ -- LL Diver 2014 LT枠

ふええ……難しいよお><

Page 55: forやめろ -- LL Diver 2014 LT枠

だったらこれでいいよねお兄ちゃん……

Page 56: forやめろ -- LL Diver 2014 LT枠

***による繰り返し

● 任意の配列Xを用意する● Xの要素yに対して、任意のブロックおよ

び関数を適用する● これを全ての要素に適用する過程を使

えば、繰り返しとなる

Page 57: forやめろ -- LL Diver 2014 LT枠

each

Page 58: forやめろ -- LL Diver 2014 LT枠

Rubyによる例

(1..100).each do |v| puts vend

Page 59: forやめろ -- LL Diver 2014 LT枠

eachからわかること

● ブロックを関数などの一つの実行単位としてまとめることができるなら、それを「ある集合」の「要素」に適用させていく過程、という書き換えることができる

Page 60: forやめろ -- LL Diver 2014 LT枠

博士の知っ得豆知識

「この配列の要素を取り出すインターフェイスをイテレーターっぽく共通化すれば、任意のオブジェクトを配列のようにあつかえるのじゃ」

「お前誰だよ」

Page 61: forやめろ -- LL Diver 2014 LT枠

ふええ……配列に対して二乗した結果が欲しいですぅ……

Page 62: forやめろ -- LL Diver 2014 LT枠

配列操作に対して安易にfor使うな

● 超べんりforブロックに成長(一ブロック1000行!)

● 並列化したいとき、切り分けが発生する● テストが配列に対するものになる

Page 63: forやめろ -- LL Diver 2014 LT枠

map

Page 64: forやめろ -- LL Diver 2014 LT枠

Pythonによる例

from __future__ import print_function

map(print, range(101))

Page 65: forやめろ -- LL Diver 2014 LT枠

mapからわかること

● それを「ある集合」の「要素」に適用させていく過程を行うことで、「要素それぞれに対して関数を適用した結果」となるように書いた方が、可読性があがる

Page 66: forやめろ -- LL Diver 2014 LT枠

そんなこと考えてるの頭でっかちな

ウェッブケーでしょ(笑)

Page 67: forやめろ -- LL Diver 2014 LT枠

Java8Stream API

Page 68: forやめろ -- LL Diver 2014 LT枠

最後に結論を

Page 69: forやめろ -- LL Diver 2014 LT枠

Q.for使ってもいい時は

ありますか?

Page 70: forやめろ -- LL Diver 2014 LT枠

私見・forを使わないほうがいいとき

● 配列を加工した結果として、新しい配列が必要な場合

● ほかの表現のほうがより適している場合(whileとかeachとかあるでしょ)

Page 71: forやめろ -- LL Diver 2014 LT枠

私見・forを使うほうがいいとき

● forでパフォーマンスを改善できる場合

● 言語的な仕様によって、上記アプローチが使えないとき

Page 72: forやめろ -- LL Diver 2014 LT枠

forを使っていいとき・巨大数を作る

Page 73: forやめろ -- LL Diver 2014 LT枠

最後に改めて

Page 74: forやめろ -- LL Diver 2014 LT枠

人間の考えを機械に合わせる

のではなく機械のほうが

人間にあわせていく

Page 75: forやめろ -- LL Diver 2014 LT枠

過去の慣習にあわせるのではなく

未来の進歩へ変化していく

Page 76: forやめろ -- LL Diver 2014 LT枠

時代はStaticおじさん

からforおじさんへ

Page 77: forやめろ -- LL Diver 2014 LT枠

ありがとうございました