目次> 第20章> 20.1 TOPUPPREVNEXT

20.1 階乗の計算

A君
先輩!10の階乗っていくつですか?
先輩
お、いきなり何だ?
階乗ってのは、1×2× ... ×10 とやればいいのだ。
A君
プログラムで書くと
     int fact = 1;
     for(int i=1; i<=10; i++) fact = fact * i;
ですね。
先輩
そんな感じかな。 fact = fact * i ; は、 fact *= i ; の方が Java らしい書き方だね。 実際に動くプログラムはどうなるかな?
A君
いつも10ではなく、コマンドラインから与えた数値の階乗を求めるようにすると、

public class Factx{
    public static void main(String arg[]) {
        if(arg.length == 1) {
            int x = Integer.parseInt(arg[0]);
            int fact = 1;
            for(int i=1; i<=x; i++) fact *= i;
            System.out.println(x + "! = " + fact);
        } else {
            System.out.println("use as: java Factx 10");
        }
    }
}

ソースプログラムは Factx.java です。
先輩
実行してごらん。
A君
Factx.gif
先輩
ここまでが復習で、これからが本題。
このプログラムでは for 文で繰り返し掛け算をしているが、 このループを使わないで階乗をもとめてみよう。
A君、9の階乗の答えをおしえてくれ。10に9の階乗を掛ければ 10の階乗が求まる。
A君
9の階乗ですか? ... 先輩、9の階乗はいくつですか?
先輩
9の階乗は、9に8の階乗を掛ければよい。
A君
8の階乗をおしえてください。
先輩
8の階乗は、8に7の階乗を掛ければよい。
あとは、自分でやるからちょっと待ってて。
7の階乗は、7に6の階乗を掛ければよい。
6の階乗は、6に5の階乗を掛ければよい。
...(中略)
先輩
2の階乗は、2に1の階乗を掛ければよい。
1の階乗は?
A君
1です。
先輩
じゃあ、2の階乗は、2掛ける1で2。
3の階乗は、3掛ける2の階乗で6。
4の階乗は、4掛ける3の階乗で24。
5の階乗は、5掛ける4の階乗で120。
6の階乗は、6掛ける5の階乗で720。
...(中略)
先輩
という具合に、10の階乗が計算される。

メソッドの書き方で書くと

    static int fact(int n) {
        if(n==1) return 1;
        else     return n * fact(n-1);
    }
となる。先ほどのプログラムを書直して実行してみてください。
A君
クラス名を Facty にして、ループを削って、メソッドを追加して...

public class Facty{
    public static void main(String arg[]) {
        if(arg.length == 1) {
            int x = Integer.parseInt(arg[0]);
            System.out.println(x + "! = " + fact(x));
        } else {
            System.out.println("use as: java Facty 10");
        }
    }

    static int fact(int n) {
        if(n==1) return 1;
        else     return n * fact(n-1);
    }
}

こんなんで、ええんかいな。
ソースプログラムは Facty.java です。 実行すると、

image/Facty.gif

いけてる、いけてる。

先輩
プログラム(メソッドの定義)の中で、自分自身を呼び出す構造を リカーシブプログラムといいます。再帰的プログラムとか、帰納的プログラム ともいわれます。
A君
ふうん。

階乗の計算がすすむ様子をみてみましょう。下の TextField に12以下の数字を いれて、「デモ開始」ボタンをクリックしてください。

上図を表示するプログラムは、 ソースプログラム factap2.java にあります。

このプログラムをよびだす HTMLファイルは こちら です。


更新日:2004-12-10 TOPUPPREVNEXT