ゆるゆるプログラミング

・階乗

階乗とは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文について解説

■新着情報

2019.04.05 ストップウォッチ その1 単純なストップウォッチクラスの作り方を解説
2019.04.05 ストップウォッチ その2 ストップウォッチクラスの作り方を解説
2019.04.04 エッジ(境界)検出 カラー画像をN値化する方法について解説
2019.03.20 階乗 階乗について解説
2019.03.20 傾き45°縞模様 傾き45°の縞模様の画像作成方法を紹介
2019.03.18 市松模様(テキスト版) 市松模様のテキスト表示方法を紹介
2019.03.15 多次元配列 多次元配列について解説
2019.03.11 配列のソート 配列を昇順・降順に並び替える方法を解説
2019.03.04 市松模様 市松模様の画像作成方法を紹介

■広告

法人向けのETC専用カード

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

 

 

 

 

 

 

 

Topへ