メソッドの実行中に他のメソッドを呼び出すことがあります。 「メソッドが実行中に、自分自身を呼び出す」ことを メソッドの「再帰呼出し」 (recursive call) と言います。
階乗(factorial)は数学的には以下のように定義できます。
fact(n) = 1, if n=0 n * fact(n-1), otherwise
階乗の計算を行なうメソッドをプログラミングしてみましょう。 fact(n) → 1*2*3*...*(n-1)*n だと考えると、int fact(int n) は以下のように定義できます。
Fact2.java 階乗の計算 (繰り返しによる) |
|
Fact2.java の実行 |
|
階乗の計算を再帰的なメソッド呼び出しを使ってプログラミングすると 次のようになります。
Fact3.java 階乗の計算 (再帰呼び出しによる) |
|
Fact3.java の実行 |
|
Fact3.javaと実質は同じですが、メソッドをもう少し短く書いた例が Fact4.java です。
Fact4.java 階乗の計算 (再帰呼び出しによる) |
|
以前の授業で ToyGraphics クラスを用いたプログラムを作りました。 また、その次の回の授業ではToyGraphics を拡張して MyGraphics クラスを 作りました。覚えていますか?
以下の例では MyGraphics クラスを利用します。
自然界では、ある物をどんどん細かくみていくと再び元の形が 現れることがあります。 そのような図形では、自分自身を縮小した図形を自分の一部分として 含んでいることになります。 これを自己相似形といいます。 フラクタルとはそのようなパターンを扱う学問分野です。
フラクタル構造を持つものの例として、地形や樹木の形などが有名です。 そこで、樹木の形を再帰的に定義して、グラフィックメソッドを用いて描いて みることにしましょう。
|
「あとどれだけ深く再帰呼び出しを繰り返すか」を (変数 level として) メソッドに渡していく方法で書いた プログラムが Fractal1.java です。
メソッド tree が void型になっていることに注意して下さい。 値を返さないメソッドは void 型として宣言します。
Fractal1.java |
|
Fractal1.java の実行 |
|
以下のような手順で計算できる数をフィボナッチ数と呼びます。
フィボナッチ数の定義 fib(0) → 1 fib(1) → 1 fib(n) → fib(n-1)+fib(n-2) n>=2 のとき「整数を引数として受けとりフィボナッチ数を計算して返すメソッド」
static int fib(int n)を Fib.java というファイルの中に作って下さい。 さらに、同じファイルの中に「キーボードから入力された整数を fib()メソッドの引数として渡して、その結果を表示する」 mainメソッドを作って下さい。
Fib.java |
|
樹木曲線 (tree curve) を描くメソッド
void tree(int level,int x,int y,int length,double angle,double theta,MyGraphics mg)をFractal2.javaというファイル中に作って下さい。さらに同じファイルの中に 以下のようなmainメソッドを定義して実行させてみましょう。
Fractal2.java |
|
|
宿題提出WEBの 「1年セミナー課題5」 http://nw.tsuda.ac.jp/tsuda/handin/up.php?id=2006/1semi/kadai5 から提出して下さい。
課題の提出〆切は7月30日 13:00です。 〆切に遅れないように注意して下さい。
正しく提出されたかどうかを http://nw.tsuda.ac.jp/tsuda/handin/list.php?id=2006/1semi/kadai5 で必ず確認しておいて下さい。