JavaScript再帰関数のいくつかの書き方

5578 ワード

再帰的にはプログラム開発の過程でよく使われます.この記録書で見たいくつかのいい例と注意点です.
再帰関数の例
一番経典のは階乗再帰手続きを求めます.
function factorial(num){
    if (num <= 1){
        return 1;
    } else {
        return num * factorial(num-1);
    }
}
呼び出しプロセスの問題
以下のように呼び出してみます
var anotherFactorial = factorial;
factorial = null;
console.log(anotherFactorial(4)); // error
上記のコードを実行すると、factorialがnullにセットされているためにエラーが発生しますが、再帰的なプログラム内部ではまだfactorial自体を呼び出しています.このときエラーが発生します.
いくつかの解決方法
使用するarguments
function factorial(num){
    'use strict';
    if (num <= 1){
        return 1;
    } else {
        return num * arguments.callee(num-1);
    }
}
arguments.calleeは実行中の関数を指すポインタであるので、関数の再帰的呼び出しを実現するためにこれを使用することができる.しかし、厳密なモードでは、スクリプトを介してarguments.calleeにアクセスすることはできません.
名前付き表現を使う
var factorial = (function f(num) {
    if (num <= 1) {
        return 1;
    }
    return num * f(num - 1);
});

var anotherFactorial = factorial;
factorial = null;
console.log(anotherFactorial(4));  //24
上記のコードはf()という名前付き関数式を作成しました.この方法は厳密で非厳格なモードでも適用されます.