Japanese subtitles

← 07xps-09 Bending Numbers Solution

Get Embed Code
3 Languages

Showing Revision 1 created 10/23/2014 by Udacity.

  1. 宿題では最適化をいくつかやってもらいました
  2. とても基本的で簡単にできる
    算術二項演算に対しての最適化です
  3. できる時には式を定数に
  4. 置き換えるというものでした
  5. ここにあるものは与えられていたもので
  6. 他のものを加えるため長くelifを続けています
  7. 最初は演算が乗算かを確かめ
    左側aが数値の1かどうか見ます
  8. そうであれば1に何を掛けても右側のbとなるので
    ここでbを返します
  9. 実行まで待つ必要はありません
  10. 必要以上の労力をかけることになります
  11. 同様に右側のbが1の時にaを返します
  12. 0を加算する場合にも同様のことを行います
  13. 演算が加算でaが数値0だとするとbを返し
  14. bが数値0だとするとaを返します
  15. 最後に数値から同じ数値を引く場合です
  16. これはわかりやすく
    減算でaとbが等しいかどうか調べればいいのです
  17. これができるのは数ではなく
    Pythonのタプルが等しい時です
  18. そして数値0を表すタプルを返し
    抽象構文木に入れます
  19. 定数畳み込みはもう少し複雑ですが
    大したことはありません
  20. 最初に両辺aとbのタプルが数値であるかを調べます
  21. そして演算が加算なら数値を返し
  22. その値はaとbの値を足したものになります
  23. こうすればプログラムを実行する時に
    あとで同じ演算をしなくて済みます
  24. 同様に減算の時はaからbを引いた
  25. 数値のタプルを返します
  26. 乗算についても同様で
    aとbの2番目の要素をかけるだけです
  27. そして演算が再帰的に最適化されれば
  28. それを元のbinopのタプルに戻して
    a、op、bを入れて返します
  29. どの場合にも当てはまらず
    binopも見つからなければ
  30. これ以上の最適化はできないので
    式をそのまま返します
  31. よいテストケースを準備してきました
  32. zero、one、twoがあり
  33. それぞれ0.0、1.0、2.0に等しい数値のタプルで
  34. さらにペルシャとマケドニアの
    古代の王や女王の名から取った変数
  35. xerxes、darius、antiochus、musaがあります
  36. 関数plusを定義して
    このタプルを書かずに済むようにし
  37. 同様にminusとtimesも定義します
  38. キーを打つ作業を少なくするためです
  39. そして式が実際に最適化されているかを見るために
  40. times(two,zero)が0と等しいかを出力し
    等しければ最適化が動いたことになります
  41. 同様に減算や
  42. もう少し複雑な計算の構文木も作っています
  43. exp3はminus(plus(zero,plus
    (one,plus(two,zero))),two)
  44. 舌をかみそうです
  45. 深く見るとplus(two,zero)はtwoになり
    別のplusの中に入ってplus(one,two)となり
  46. そのplus(one,two)がzeroに足され
  47. さらに全体からtwoを引いています
  48. つまり大量の括弧を乗り越えれば
  49. 3-2になります
  50. これがoneになるかどうかを確かめます
  51. 同様のことを式についても確かめて実行してみると
  52. すべてのテストでうまくいったとわかります
  53. このテストケースは手作業で作られており
  54. これを通れば最適化が
    問題文のとおりにできているとわかります
  55. 普段からこれほどテストする必要はありませんが
  56. 今回はこれが最適でした