10以内の階乗を試してみましょう:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>js中递归函数的使用</title> <script type="text/javascript"> function f(num){ if(num<1){ return 1; }else{ return f(num-1)*num; } } </script> </head> <body> <script type="text/javascript"> alert("10!的结果为:"+f(10)); </script> </body> </html>
再帰関数の呼び出しは以上です
jsの再帰関数が自分自身を呼び出すときの保険の方法です。
高度な JS プログラミングより
典型的な階乗再帰関数:
function fact(num){ if (num<=1){ return 1; }else{ return num*fact(num-1); } }
次のコードはエラーを引き起こす可能性があります:
var anotherFact = fat;
fact = null;
alert(antherFact(4)); //エラー
fact は関数ではなくなったため、エラーが発生しました。
この問題は、実行される関数へのポインタであるarguments.calleeで解決できます。
新しい関数は次のとおりです:
function fact(num){ if (num<=1){ return 1; }else{ return num*arguments.callee(num-1); //此处更改了。 } } var anotherFact = fact; fact = null; alert(antherFact(4)); //结果为24.
JS における通常の再帰の改良点
以下に示すように、関数が名前でそれ自体を呼び出すときに再帰関数が形成されます:
function factorial(num) { if(num<=1) { return 1; } else { return num * factorial(num-1); } }
これは古典的な階乗関数です。表面的には問題がないように見えますが、次のコードにより問題が発生する可能性があります。
var anotherFactory = 階乗;
anotherFactorial(4); //出力 24
factorial = null;
(4); //TypeError: オブジェクト [オブジェクト ウィンドウ] のプロパティ 'factorial' は、
関数 chrome でテストします
その理由は、定義した関数名が実際には関数へのポインターであり、この時点で anotherFacttorial が定義されているためです
また、その関数もポイントしているため、anotherFactory (4) を呼び出すと正常に 24 が出力されます。
この時点では、factorial = null; となります。
この場合、実行定義関数への参照はanotherFactorialとなり、anotherFactorial(4)を呼び出すと上記のエラーメッセージが表示されます。
このとき、arguments.callee を使用して関数定義の階乗を置き換えることができます。
関数の定義は次のようになります。
function factorial(num) { if(num<=1) { return 1; } else { return num * arguments.callee(num-1); } }