YouTube

Got a YouTube account?

New: enable viewer-created translations and captions on your YouTube channel!

Japanese subtitles

← 03x-02 Maximum Solution

dummy description

Get Embed Code
3 Languages

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

  1. ではfの戻り値を最大化する
    空でないリストlの要素を探しましょう
  2. この関数を“findmax(f,l)”と定義します
  3. 概念的には
    “これまで出た中で最大のものを覚えておく”
  4. また“リストをたどってよりよいものを探索する”
    という方法をとります
  5. 変数名は “これまでで最高のもの”という意味の
    “best_element_sofar”と
  6. “最もよいfの値”という意味の
    “best_f_value_sofar”です
  7. ここではリスト内の要素を
    最後まで繰り返し見ていきます
  8. またここでは要素を取り出して
    そこに関数fを呼び出します
  9. 適切な値が見つからない場合 または
    戻り値がこれまでに見た最高のものより高ければ
  10. おめでとうございます!
  11. その要素は新しいチャンピオンに昇格しました!
  12. そしてこれで完了です
    これまでで最高の要素を返しました
  13. 個人的には最初に小さなテストケースを作ることを
    おすすめします
  14. 例えば前回の文字列のような
    大きなケースに移る前に
  15. 感触を確かめることができるからです
  16. では私が間違えずにこのPythonプログラムを
    書けたか見てみましょう
  17. さあどうでしょうか
  18. ああ! ここに間違いがあります
  19. ここではbest_element_sofarと返していますが
  20. インデントエラーがありました
  21. “unindent does not match
    any outer indentation level”とあります
  22. これは13行目です
  23. 戻ってみましょう ああ間違っていますね
  24. タブがもう1つ必要でした
  25. 皆さんは気づいていましたか?
  26. 何らかの理由でタブが正確に打てていませんでした
  27. ここを直して再度トライしてみましょう
  28. 期待どおり“quick”と返されました
  29. これがこのリストの最大の長さを持つ要素です
  30. 別のテストを試しましょう
  31. 5、-6、3、2です
    今回は最大の絶対値を持つ要素を検索します
  32. これは-6になるはずです
  33. -6と出ました!
  34. findmaxはうまくいっているようですが
    実は違うのです
  35. この実装にはバグがあります
  36. 私が作ったテストではリストは順不同です
  37. インプットとしてリストをとる
    コーナーケースを試してください
  38. リストは正の順序か逆順か順不同のどれかです
  39. これまで試した2つのテストは順不同でした
  40. リストを含むプログラムをテストする時は
  41. 正の順序、逆順、順不同のすべてを試してください
  42. では逆順で試して
    正しい答えが出るか見てみましょう
  43. 4になるはずです
    4になりました すばらしい
  44. では正の順序で正しい答えが出るか見てみましょう
  45. -4のはずですが-3です
    これは正しい答えではありません どうしますか?
  46. コードのどこかにバグがあり場所は不明です
  47. これに最初に対処する方法の1つに
  48. print文デバッグというものがあります
  49. では毎回このループを入力する度にiの値が何かを
    出力するようにこのプログラムを変更します
  50. 順調に進んでいるか確認するためです
  51. ここでeltとf_valueを出力します
  52. 問題なくprint文デバッグを
    追加できるか見てみましょう
  53. 大丈夫です とてもよさそうです
  54. スタートはi=0でeltが1、
    f_valueが1です よさそうです
  55. そしてiが1、eltが2、f_valueは2です
    いいですね
  56. それからiが2、eltが-3、f_valueが3
  57. ここまでで絶対値を呼び出していることを
    確信できます
  58. しかし私が探しているのは−4であり
    このままではたどり着きそうにありません
  59. これはiが十分に高い値に達していないことを
    示しています
  60. iはこの範囲の要素をすべてカバーしています
  61. では理解を深めるために出力してみます
  62. range(len(l)-1)
  63. この最初の部分ではiが0、1、2しかカバーしません
  64. しかし本当は0、1、2、3をカバーしたいのです
  65. これをスッキリさせましょう
  66. 実はこのリストももっとシンプルにできます
  67. これでリストと要素インデックスが
    同じになりました
  68. 答えとして3を取得したいのですが ここを見ると
  69. iの範囲は0、1、2だけです
    下に続く行を確認すると
  70. 2がベストなのでそれを返します
  71. この最後の要素は出てこないので
  72. このセットは何かが間違っている可能性があります
  73. 最後の要素が欠けています
  74. ここでは1を減算する必要はありません
  75. Pythonのリストは0から始まるので
    つい1を減算したくなりますが
  76. “range(4)”とするだけで
    0、1、2、3をカバーできるのです
  77. 見てください
    range(4)=[0,1,2,3]ですね
  78. そしてi ranges over[0,1,2,3]ですので
    期待した答えが出ました
  79. では文字列の問題に戻りましょう
  80. “Barbara”、“Kingsolver”、“Wrote”、
    “The”、“Poisonwood”、“Bible”です
  81. これが信頼できればKingsolverかPoisonwoodの
    どちらかが出るはずです
  82. Barbaraが7、Kingsolverが10、Wroteは5
    Theが3、Poisonwoodが10で
  83. 最後はKingsolverです
    これは完璧に正しい答えです
  84. しかしprint文デバッグを終え
    問題のバグがもう現れない場合は
  85. それが出力の一部であると誤解されないように
  86. 提出前にprint文を削除するべきです
  87. 今回はKingsolverのみが返されました