ページ

2014/04/02

勉強:再帰処理とは?

再帰的(recursive)とは、アルゴリズムの一種です。


例としてよく用いられる階乗の計算を紹介します。
数学では(!:エクスクラメーションマーク)で、階乗を表します。

階乗… (n:非負の整数値)
    n! = n × (n-1) × … × 3 × 2 × 1
    0! = 1
    |
    |簡略化
    ↓
    0! = 1
    n! = n * (n-1)!

例:4!=4×3×2×1=24

これをプログラムで組んでみます。
public class factorial {
    static int fact(int n) {
        if(n==0) {
            return 1; // 0! = 1
        } else {
            return n * fact(n-1); // n! = n * (n-1)! ←ここが再帰呼び出し
        }
    }

    public static void main(String[] args) {
        int n = Integer.parseInt(args[0]);
        if(0<n) {
            System.out.println(n+"! = "+fact(n));
        } else {
            System.out.println("※非負の整数値を入力してください。");
        }
    }
}

・流れ
引数(4)を与える

非負の整数のためfact(4)が呼ばれる

n(4)=0ではない

n*fact(n-1)が呼ばれる
4*fact(3)
    3*fact(2)
        2*fact(1)
          1*fact(0)

return 計算結果(24)

このfact()でfact()自身を呼び出しているというのが再帰呼出しです。
1*fact(0)の次はn(0)=0なので1が返されます。
then節が実行されると再帰呼出しが停止します。(再帰の停止条件)

つまり、「4*3*2*1」の処理をif elseのreturn内で行っているということです。

参考
再帰 - Wikipedia
再帰呼出し
if-then文を理解する
プログラミング言語2 - 関数と再帰
【改訂版】Eclipseではじめるプログラミング(3):プログラミングの醍醐味! Javaで“条件式”を理解する (1/3) - @IT

0 件のコメント:

コメントを投稿