【Java】階乗
この記事は、「新・明解Javaで学ぶアルゴリズムとデータ構造」を読んで学んだことを、個人的な備忘録目的でまとめています。
ただし、本を参考にして自分なりに構成やコードを変更しているためご注意ください。
アルゴリズムの詳細や解説は是非参考書をお手に取って読まれてください。
【リンク紹介】
・Javaで学ぶアルゴリズムとデータ構造
・これまで書いたシリーズ記事一覧
この記事は再帰的アルゴリズムについてまとめました。
基本用語確認
アルゴリズム
問題を解くためのものであって、明確に定義され、順序付けられた有限個の規則からなる集合。
(「JIS X0001」より。JISとは日本産業規格のこと。)
再帰的
『ある定義の中で、自分自身の定義を使うことを再帰的(recursive)という。』
(増原英彦氏の「計算機プログラミングⅠ(11) 再帰」より引用(2025.5.10時点))
再帰的なメソッド定義
『あるメソッド定義の中で、そのメソッド自信を呼び出しているようなものを再帰的(recursive)メソッド定義という。』
(増原英彦氏の「計算機プログラミングⅠ(11) 再帰」より引用(2025.5.10時点))
帰納的なメソッド呼出
『あるメソッド定義の中で、そのメソッド自身を呼び出すこと』
(増原英彦氏の「計算機プログラミングⅠ(11) 再帰」より引用(2025.5.10時点))
階乗
正の整数
順列
正の整数
階乗
階乗の実装
再帰的なメソッド定義による階乗の実装は次の通り。
//--- 非負の整数値nの階乗値を返却 ---//
static int factorial(int n) {
if (n > 0) // ①
return n * factorial(n - 1); // ②
else
return 1; // ③
}
アルゴリズムのイメージ図
つまり
階乗の利用例
import java.util.Scanner;
public class Factorial {
//--- 非負の整数値nの階乗値を返却 ---//
static int factorial(int n) {
if (n > 0) // ①
return n * factorial(n - 1); // ②
else
return 1; // ③
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("【階乗値を求める】");
System.out.print("整数を入力せよ:");
int x = stdIn.nextInt();
System.out.println(x + "の階乗は" + factorial(x) + "です。");
}
}
実行結果
【階乗値を求める】
整数を入力せよ:3
3の階乗は6です。
おまけ
順列の実装と利用例
順列(permutation)
import java.util.Scanner;
public class Permutation {
//--- 非負の整数値nの順列値を返却 ---//
static int permutation(int n, int k) {
if (n > k) // ①
return n * permutation(n - 1, k); // ②
else
return k; // ③
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("【順列P(n, k)を求める】");
System.out.print("整数nを入力せよ:");
int x = stdIn.nextInt();
System.out.print("整数kを入力せよ:");
int y = stdIn.nextInt();
System.out.println(x + "の順序は" + permutation(x, y) + "です。");
}
}
実行結果
※実行文に表示されているP(n, k)は
【順列P(n, k)を求める】
整数nを入力せよ:5
整数kを入力せよ:3
5の順序は60です。
ご協力のほどよろしくお願いします。
Discussion