2nd term 4th week - dsuz/csharp GitHub Wiki

今回のテーマ

  1. ジェネリック メソッド
  2. アルゴリズム入門
    1. フィボナッチ数(再帰呼び出し)
    2. 素数判定(エラトステネスのふるい)

準備

  1. CSharp2-4.zip をダウンロードし、展開する
  2. 展開した .sln ファイルを Visual Studio で開く
    • 注: zip ファイルは必ず展開すること。 圧縮フォルダの中にある .sln ファイルを開いても正しく動作しません
  3. ソリューション エクスプローラーから GenericMethod プロジェクトの中にある GenericMethod.cs をダブルクリックしてソースコードを表示する
  4. ソースコードが表示されたら、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 などの大きい素数を使うとよい。

課題 1(2点)

4 以上の偶数は素数ではない。そのため、n が素数であるかどうかを判定するために 4 以上の偶数で割り切れるかを確認する必要はない。

課題 2(5点)

n が素数であるかどうかを判定するために、n の平方根より大きい整数で割る必要はない。

課題(paiza の問題を解く)

課題 3(2点)

paiza の フィボナッチ数の問題 に正答せよ。

課題 4(3点)

paiza の 素数判定の問題 に正答せよ。

⚠️ **GitHub.com Fallback** ⚠️