[TDD の練習(4)] フィボナッチ数列の問題 ~ その1 : 数列を生成する
ぴえろっちが教えてくれた Project Euler の問題 ( かってに改題 f(^^; ) より。
…いや、 オリジナルを示しておきましょか。
Project Euler .net ~ Problem 2 ( 19 October 2001 )
日本語訳: Project Euler ~ Problem 2
フィボナッチ数列の項は前の2つの項の和である。最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。
この問題を解くプログラムには、 2つのモノが必要でしょう。
ひとつは、 フィボナッチ数列を生成するモノ。 ちゃんとフィボナッチ数列を作り出すことができなければ、 総和を求めるもへったくれもありません。
そしてもうひとつは、 生成されてくるフィボナッチ数列から偶数を選び出して集計してくれるモノ。 こいつに、 「数列の項が400万を超えない範囲での合計はどんだけ?」 って聞いてやれば、 答えが返ってくるわけです。
ということで、 まずは、 「フィボナッチ数列発生機」 を作ります。
例によって、 どんなテストコードを書いていけばいいのかを、 文章で書いてみますので、 ユニットテストに書き下してみてください。
※ サンプルは C# 2008 EE で作りました。 ので、 カッコつけて yield retun を使ってます。 f(^^;
- n=1 のとき、 1が返る。
→ 実装は yield return 1; だけでいい。 シグネチャ等を確定させる。
- n=2 のときは、 2。
→ テストの方法を考える。 実装は、 最初は 1、 次は 2 を yield return してやる。
- n=3 以降のとき ( 適当な個数の期待値を用意してやる以外は、 2. と同じテスト )
→ 実装のコア部分は、これで完成する。
- [確認テスト] n が大きくなると例外が出るはず。 無限ループを回してみて、 例外が出ることを確認し、 その後、 try ~ catch のカタチのテストに直しておく。
※ n が幾つまでいけるのか? 使う人に情報を提供するためのテストです。 もちろん、 もし要件に満たなければ、 int を long に変えるなどの修正が必要になりますね。
回答例 ( C# + NUnit 用のソースコード ) はこちら → FibonacciSequenceGeneratorTest.cs [3KB]
ちゃんと自分で書いてみてから、 見てくださいね f(^^;
そして、 このテストコードをパスするように実装とリファクタリングしたコードは、 こうなりました。
using System.Collections.Generic;
namespace フィボナッチ数列 {
public static class フィボナッチ数列発生機 {
public static IEnumerable<int> Getフィボナッチ数列() {
int f1 = 0;
int f2 = 0;
int f3 = 1;
while (true) {
f1 = f2;
f2 = f3;
f3 = checked(f1 + f2);
yield return f3;
}
}
}
}
※ 途中経過をコメントに残したコードは、 こちら → FibonacciSequenceGenerator.cs [2KB]
| 固定リンク
「プログラミング」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
「-プログラミング ( わんくま )」カテゴリの記事
- [わんくま名古屋] 第21回: Metro サンプルコード解説 (1/3)(2012.04.15)
- [わんくま名古屋] 第21回は 4月 14日 - Windows 8 Metro をやるよ~♪(2012.04.12)
- [わんくま東京] 第59回の資料を公開しました(2011.06.02)
- [わんくま東京] 第59回は 5月 28日 - 名古屋から侵略します♪(2011.05.23)
- [わんくま名古屋] 第17回は 4月 9日 - TDD ネタで喋ります(2011.04.03)
この記事へのコメントは終了しました。
コメント