ホームページ > ウェブフロントエンド > jsチュートリアル > js での再帰関数の使用の概要

js での再帰関数の使用の概要

黄舟
リリース: 2016-12-12 14:41:12
オリジナル
1261 人が閲覧しました

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); 
} 
}
ログイン後にコピー
上記の 4 行のテスト コードを使用すると、テスト コードの最後の行も正常に出力できます。 24.

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート