Javaプログラミング学習サイト ゆるゆるプログラミング

2019/03/20 公開

・階乗

階乗とは1からnの全ての自然数の積のことで、n!と書きます。

n!は1~nの掛け算なので、

  nx(n-1)x(n-2)x … 3x2x1

となります。n=0の場合、0!=1と定義されます。また、nがマイナスの場合には計算できません。

次に、0!=1の理由について説明します。4の階乗から1の階乗の計算を順を追って見ていくと、

  4!=4x3x2x1=24

  3!=3x2x1=6

  2!=2x1=2

  1!=1=1

となります。

別の書き方をすると、

  3!=4!÷4

  2!=3!÷3

  1!=2!÷2

と書け

  n!=(n+1)!÷(n+1)

であることがわかります。

それでは0!はどうでしょう。

  n!=(n+1)!÷(n+1)

に0を代入すると

  0!=(0+1)!÷(0+1)=1÷1

となり、

  0!=1

となることがわかります。

ここで、階乗を計算するJavaソースコードを紹介します。このソースでは、for文で1からnの値の積を求める方法で階乗を計算しています。

Factorial1.java ← クリックしてダウンロードページに移動
001:    public class Factorial1 {
002:    	// 階乗メソッド
003:    	static int factorial( int n )
004:    	{
005:    		// nがマイナスの場合、nを戻す
006:    		if ( 0 > n ) return n;
007:    
008:    		// nが1の場合、0を戻す(0!=1)
009:    		if ( 0 == n ) return 1;
010:    		
011:    		// nが1以上の場合の処理
012:    		int ans = 1;
013:    		for ( int i = 1; i <= n; ++ i ) {
014:    			ans = ans * i;
015:    		}
016:    
017:    		// 結果を戻す
018:    		return ans;
019:    	}
020:    
021:    
022:    	// メイン
023:    	public static void main( String[] args ) {
024:    		// 変数宣言
025:    		int n;	// 階乗を求める値
026:    
027:    		// 入力した引数が1以上かを調べる
028:    		if ( 1 > args.length ) {
029:    			// 入力した引数が1未満の場合、使用方法を表示する
030:    			System.out.println( 
031:    				"Factrial1 [階乗を求める値n]" );
032:    			return;
033:    		}
034:    
035:    		try {
036:    			// 引数を変換し、変数nに代入
037:    			n =  Integer.valueOf( args[ 0 ] );
038:    		}
039:    		catch( NumberFormatException ne )
040:    		{
041:    			System.out.println( "引数が不正です" );
042:    			return;
043:    		}
044:    
045:    		// 階乗メソッドの呼び出し n!
046:    		int ans = factorial( n );
047:    		System.out.println( n + "の階乗は" + ans + "です" );
048:    	}
049:    }

Factorial1を実行

C:\talavax\javasample>java Factorial1 5

1つ目の引数に5を渡して、5!を求めます。

実行結果

5の階乗は120です

次に、再帰を使った階乗計算のJavaソースコードを紹介します。

Factorial2.java ← クリックしてダウンロードページに移動
001:    public class Factorial2 {
002:    	// 階乗メソッド(再帰版)
003:    	static int factorial( int n )
004:    	{
005:    		// nがマイナスの場合、nを戻す
006:    		if ( 0 > n ) return n;
007:    
008:    		// nが1の場合、0を戻す(0!=1)
009:    		if ( 0 == n ) return 1;
010:    
011:    		// factorialをfactorialメソッド内で呼ぶ(再帰)		
012:    		return n * factorial( n - 1 );
013:    	}
014:    
015:    
016:    	// メイン
017:    	public static void main( String[] args ) {
018:    		// 変数宣言
019:    		int n;	// 階乗を求める値
020:    
021:    		// 入力した引数が1以上かを調べる
022:    		if ( 1 > args.length ) {
023:    			// 入力した引数が1未満の場合、使用方法を表示する
024:    			System.out.println( 
025:    				"Factrial1 [階乗を求める値n]" );
026:    			return;
027:    		}
028:    
029:    		try {
030:    			// 引数を変換し、変数nに代入
031:    			n =  Integer.valueOf( args[ 0 ] );
032:    		}
033:    		catch( NumberFormatException ne )
034:    		{
035:    			System.out.println( "引数が不正です" );
036:    			return;
037:    		}
038:    
039:    		// 階乗メソッドの呼び出し n!
040:    		int ans = factorial( n );
041:    		System.out.println( n + "の階乗は" + ans + "です" );
042:    	}
043:    }

Factorial2を実行

C:\talavax\javasample>java Factorial2 5

1つ目の引数に5を渡して、5!を求めます。

実行結果

5の階乗は120です

for文と使った方法と、再帰を使った方法で同じ結果が出力されます。階乗計算に再帰を使う必要はないと思っているのですが、階乗メソッドは再帰を理解するためには良い例題です。参考にしてください。

ちなみに、これらのプログラムの中の階乗を計算するメソッド引数にマイナスの値が渡されたときに、引数の値をそのまま戻すようにしています。

■関連コンテンツ

四則演算(足し算/引き算/掛け算/割り算)について-画像

計算結果の表示

足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)の使い方を説明

繰り返し処理に使用するfor文について解説-画像

for文

繰り返し処理に使用するfor文をJavaのソースコードを使って説明しています。

条件による処理の分岐に使用するif文について解説-画像

if文

条件による処理の分岐に使用するif文について解説

■新着情報

2022.07.07 外部プログラムの実行 exeファイル実行
2022.07.06 完全数 6=1+2+3

■広告

 

 

 

 

 

スッキリわかるJava入門第3版 [ 中山清喬 ]

価格:2,860円
(2021/6/18 14:32時点)
感想(6件)

 

 

 

Topへ