2nd term 4th week - dsuz/csharp GitHub Wiki
- ジェネリック メソッド
- アルゴリズム入門
- フィボナッチ数(再帰呼び出し)
- 素数判定(エラトステネスのふるい)
- CSharp2-4.zip をダウンロードし、展開する
- 展開した .sln ファイルを Visual Studio で開く
- 注: zip ファイルは必ず展開すること。 圧縮フォルダの中にある .sln ファイルを開いても正しく動作しません
- ソリューション エクスプローラーから GenericMethod プロジェクトの中にある GenericMethod.cs をダブルクリックしてソースコードを表示する
- ソースコードが表示されたら、F5 を押して、実行できることを確認する
ジェネリック メソッドを使うと、型が不定な関数を作ることができる。Unity の C# では GetComponent() で使われている。
教材のプロジェクトでは、「2つの値のうち、大きい方を返す」という処理をオーバーロードとジェネリック メソッドの2パターンで記述している。
- オーバーロードのパターンでは、受け取りたい型の数だけ関数を定義する必要がある。また同じ処理を何度も書かなければならない。
- ジェネリックのパターンでは、条件を満たす型ならなんでも処理できる。型が満たさなければならない条件は「比較可能」なことである。
- 独習 C# - 9.5.5 ジェネリック メソッド
フィボナッチ数(フィボナッチ数列)とは、以下のような数(数列)である。
- 0 番目のフィボナッチ数は 0 である
- 1 番目のフィボナッチ数は 1 である
- 2 番目以降のフィボナッチ数は、直前の 2 つのフィボナッチ数の和である
つまり、n 番目(ただし、n >= 2 とする)のフィボナッチ数を Fn とすると、以下の式が成り立つ。
- Fn = Fn-1 + Fn-2
フィボナッチ数をプログラミングで求める時に、再帰呼び出しを使って求めることができる。
再帰呼び出しとは、関数の中で自分自身を呼び出すことである。基本的なプログラミングのパターンである。
再帰呼び出しを使うと記述は簡単になるが、以下の問題がある。
- 再帰の回数が増えると処理が遅くなる
- 再帰の回数が増え過ぎるとスタックオーバーフローを起こす
「エラトステネスのふるい」とは、素数を見つけるためのアルゴリズムである。このアルゴリズムを使って、ある数が素数であるかどうかを判定することができる。
素数判定の手順としては非常に単純で、n が素数であるかどうかを判定するには、2 ~ n-1 で割り切れるかどうか試してみればよい、というやり方である。
2 ~ n-1 のうちどれか一つででも割り切れたら n は素数ではない。2 ~ n-1 のすべてで割り切れなかったら n は素数である。と判定できる。
以下の課題を踏まえて PrimeNumber.cs を修正し、処理速度向上を図れ。処理速度を計るためには 524287 128456903 などの大きい素数を使うとよい。
4 以上の偶数は素数ではない。そのため、n が素数であるかどうかを判定するために 4 以上の偶数で割り切れるかを確認する必要はない。
n が素数であるかどうかを判定するために、n の平方根より大きい整数で割る必要はない。
paiza の フィボナッチ数の問題 に正答せよ。
paiza の 素数判定の問題 に正答せよ。