Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

forやめろ -- LL Diver 2014 LT枠

34,321 views

Published on

LL Diver 2014

Published in: Software
  • Be the first to comment

forやめろ -- LL Diver 2014 LT枠

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

×