再帰関数

再起関数っていう単語を見るとなんか難しく見えますが、関数の中で自分の関数を呼び出すことです。

つまり, addという関数を作ったらadd関数の中でadd関数を呼び出すことです。

つまり下のようです。

function add(){
  add();
}

この例は数学で出る階乗(factorial)を利用して例を作ります。

いきなり数学に関するのが出てきて頭が痛くなる方もいると思いますが、

俺って階乗について知らないから、この講座から出ると思う方もいると思いますが、

心配しないでください。

階乗(factorial)って、

最初の数字に1小さい数字を掛けるまた1小さい数字を掛けるそして..1になるまで

たとてば、5から始めると

5x4x3x2x1 です。

これが階乗(factorial)(!)です、記号は!です。

5! こう書いて, 5!を解けてとしたら 5*4*3*2*1 なので 120が答えです。

こう階乗(factorial)について調べました。

では 10! はなんでしょうか。

10*9*8*7*6*5*4*3*2*1 計算します。. ^-^* 答えは 4,939,200です。

では、自分自身の関数を呼び出す再起関数について調べましょう。

ソースは次のようです。

再起関数をしたのソースを見ながら理解して見ましょう。

function factorial(fnum){
    end_num = 1;
    if (fnum == end_num) {
        return end_num;
    } else {
        return fnum * factorial(fnum-1);
    }
}
document.write(factorial(3));

関数呼び出し

document.write(factorial(3));

関数呼び出しは出力文の内で3をアーギュメントで送ります。

factroial関数のfnumに3が代入されます。

function factorial(fnum){
  end_num = 1;
  if(fnum == end_num) return end_num;
  else return fnum*factorial(fnum-1);
}
document.write(factorial(3));

end_num = 1がある理由は

end_num = 1;

再帰関数は自分が1になるまで掛けるからです。

fnum と end_numのバリューが同じの時

if(fnum == end_num) return end_num;

end_numのバリュー 1で fnumのバリューは 3です。 fnumバリューが 1になると end_numバリューを返還してという意味です。

fnumのバリューが end_numと同じじゃない場合

else return fnum*factorial(fnum-1);

fnum*factroial(fnum-1)を返還します。. fnumのバリューが 3だとしたら、

3*factorial(2)を返還します。 ではこの部分はまた関数呼び出しになります。

しかし バリューをもらいましたが呼び出し文な factroial(2)があるから関数は呼び出され 2を あーギュメントのバリューにしてelse文をあって2*factorial(1)を返還します。

そうしたら呼び出し文なfactorial(3)は 3*2*factorial(1)になりますね factorial(1)は 呼び出され end_numのバリューと同じなので1を返還し

呼び出し文は3*2*1を出力バリューにします。

もう一度簡単に説明すると、

関数呼び出し factorial(3)を実行

fnumバリューが 3になり else文によって3*factorial(2)を返還

3*factorial(2)에서 factorial(2)는 함수 호출 하고 매개변수값이 2이므로, else문을 만나서 2*factrorial(1)을 반환하고 1을 매개변수 값으로 해서 호출하고

3*factorial(2)で factorial(2)は関数呼び出してアーギュメントのバリューが2なので、 else文をあって 2*factrorial(1)を返還し 1をアーギュメントのバリューとして呼び出して

end_numと fnumが 一致するのでif文をあって 1を返還,

関数は 3*2*1を返還します。^^

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>coreasur JavaScript</title>
<script>
    function factorial(fnum){
        end_num = 1;
        if(fnum==end_num) return end_num;
        else return fnum*factorial(fnum-1);
    }

    value = 3;
    document.write(value + "! = "+factorial(value));
</script>
</head>
<body>
</body>
</html>

結果

confirm

これで再起関数は終わりです。ありがとうございます。