有名なエクササイズをやってみましょう､ これは面接の質問として出てくるかもしれませんね｡
フィボナッチ数の実装に挑戦します｡
そして､ フィボナッチ数はこのようなものです｡
最初の数値は0です｡
そうすると､ 2番目の数字は1です｡
いつもゼロイチから始まる｡
そうすると､ こうなるんです｡
ゼロと1を足して､ 次の数字にするのです｡
1と1を足して､ 次の数字と同じにします｡
2で1を足して次の数字に､ 3で次の数字に､ 5で8を足して次の数字に､
といった具合に｡
ご覧のように､ これは指数関数的に大きくなっていきます｡
まあ､ 本当に高く､ 本当に速く成長するんです｡
そして､ このようなナンバリングは､ 実は自然界にもたくさん現れているのです｡
しかし､ この数字は､ 最初は本当にゆっくりと増えていくのですが､ だんだん大きくなっていき､
リソースを独占してしまう問題になるので､ 面白い問題でもありますね｡
だから､ こうしてほしいのです｡
関数を作成します｡
FIBです｡
それには数字が必要です｡
そして､ この中の数字がフィボナッチのインデックス番号になるのです｡
だから､ たとえば20番目の番号だったら､ こうなっているはずだ｡
だから､ もし私が望んだら､ 例えばファイバー20とします｡
ここで､ その場合､ この数字を全部返してほしい｡
ジェネレーターを使用｡
だから､ この場所にたどり着くまでが一つ一つなんです｡
さて､ これには2つの方法があります｡
リストでやってもいいし､ ジェネレーターでやってもいい｡
ジェネレーターを使えば､ リストよりもずっと簡単にできることにお気づきでしょう｡ リストではいずれリソースが足りなくなりますから｡
そこでやっていただきたいのは､ ここに表示されている数字を20まで出力することです｡
そして､ なんならその数字をどんどん増やしていって､ どうなるか見てみるといい｡
おまけに､ リストでも実装してみてください｡
だから､ 巨大なリストにも表示される｡
ここで必要に応じてビデオを一時停止してください｡
そうでなければ､ このまま答え合わせをするつもりです｡
まず､ Aを0に､ Bを1にするとします｡
AとBが数字の始まりになるわけです｡
さて､ ここではアレンジジェネレーターを使用します｡
ループするように｡
この回数は､ 関数を提供することになります｡
今､ この中に｡
まず､ b to nowまたはeh to nowは､ Bが1であった場合と､ Bが次の数字になる場合に等しくなるようにしたいです｡
フィボナッチの法則を覚えていますか？
最初の2つの数字を足して､ 3番目の数字を得る｡
そこで､ 次の数字を得るためにBを用意し､ さらに次の数字を得るためにBを用意する｡
そして､ Bで次の数字を出す｡
そこで､ まず最初に､ 実際にaを降ろし､ aが何であれ私に渡してください､ と言って､ 次の部分まで関数を一時停止させます｡
その後､ forループが次の部分に行った後､ AをBに等しくしたいと言うつもりです｡
そして､ BはA＋Bと同じにしたい｡
その意味がわかるかどうか｡
このリストからaを返すか降ろすかして､ 最初は0になるようにしてくれ､ と言っているんです｡
それから､ Aが1になったから今度は1を等しくして､ 以前は1だったのをBに等しくしてほしい｡
だからBは2になる｡
ここにAとBがあり､ それを1つずつ移動させるわけです｡
だからBはやはり1であるべきだ｡
つまり､ ここでやりたいことは､ 実際にはaを修正しないことです｡
AプラスBができるようになるまで｡
では､ どうすればいいのか｡
まあ､ 単純に言えばいいんですけどね｡
一時的な変数としましょう｡ このtempは､
ここに来たときにaが何であったかを保持することになります｡
さらにBが元々何であったとしても､ それは1である｡
これは混乱を与える可能性があることは承知しています｡
ここで一時停止して､ プリントアウトして何が起こっているのか正確に確認したいかもしれませんが､ この関数がこれで動作することを願います｡
今､ fibのxの値を100とすると､ このようなことができます｡
そして､ その答えをプリントアウトしてみましょう｡
だから､ 印刷する｡
Xと私はこれを実行します｡
よし､ 見てみよう｡
フィボナッチ数を全て取得する｡
実行をクリックすると､ 例で見たような20をやってみましょう｡
4181が表示される｡
だから私は19歳です｡ ゼロから始まることを忘れないでください｡
ですから､ 技術的にはここで､ もし望むなら､ ここで21を行い､ 実行をクリックすることができます｡
そして､ 彼女が6､ 7､ 6､ 5を得たとき､ それはここで得たものです｡
とても､ かっこいいです｡
しかし､ その数が飛躍的に増えるのはおわかりいただけると思います｡
1000まで増やすと
さて､ これをリストでやるとしたら､ 次のようになります｡
ここでコピーしよう｡
さて､ 52 with a listは､ ここにリストを追加しなければならないことを意味します｡
そして､ yieldingの代わりにresult dot appendを行います｡
そして､ 初期値であるaの値が何であれ､ それを追加することになります｡
そして､ 今までと同じことをするのです｡
つまり､ ELTの代わりに､ このリストに追加して､ 最後にreturnするだけなのです｡
リスト結果です｡
さて､ これをfib 2とし､ 100を与えて実行をクリックすると､ ジェネレータで元のものをコメントアウトしてみましょう｡
まあ､ これは印刷したほうがいいんじゃないですか？
では､ プリントをやってみましょう｡
そして､ 「実行」をクリックします｡
わかりました｡
膨大なリストですね｡
さて､ ここで1000としたら｡
見たか？
かなり時間がかかっていますね｡
1万人やったらどうする？
わかりました｡
確かに時間がかかっていますね｡
そして､ これがいかに大変な作業であるかが､ こちらでおわかりいただけると思います｡
あのさぁ...｡
止めようと思う｡
そして､ 私たちの発電機に戻りましょう｡
ウェイ
そして､ ここで1万円やりましょう｡
ジェネレーターで10,000がどう見えるか見てみましょう｡
まあ､ それでも頑張ってくれているのですが､ 何一つ記憶に残っていないんです｡
1枚ずつプリントしていくだけで､ 私たちの場合は行動できるんです｡
さて､ これは面接でよく聞かれる質問です｡
実は､ ちょっと不必要に分かりにくいと思うんです｡
しかし､ ジェネレーターの威力は実証済みです｡
このビデオは何度か見ていただく必要があるかもしれませんが､ ここまでで範囲の使い方や､ ジェネレータを使ったパフォーマンスの向上について､
少しは慣れていただけたかと思います｡
次回作でお会いしましょう｡
バイバイ｡