再帰の目的は、自分自身を呼び出す関数を作成することです。
相互再帰があるかもしれません -- 関数 A が関数 B を呼び出し、関数 A を呼び出します... しかし、それはここでは確かに必要ありません。リープフロッグ パターンでそれらを実行する必要があること。
再帰が作用するのは、ループについて考えているときです。
通常、ループを使用すると、2 つまたは 3 つのループが互いに重なってしまうことがあります。
ループの管理について心配する代わりに、再帰は、ループの 1 回の繰り返しで何が起こるかを考え、それを行うために必要なコードのみを記述する方法です。
単数再帰の非常に単純な例は、配列のすべての要素をコンソールに記録することです。
これは実用的な例ではありません。実用的な例を作成するために必要なほとんどの部分を備えた簡単な例です。
var array = [ "one", "two", "three", "four" ];
function listNextItem (array, index) {
var item = array[index];
if (!item) { return; }
console.log(item);
listNextItem(array, index + 1);
}
listNextItem(array, 0);
最も内側のループの内側のように見える非常に単純な関数を作成しました。
に基づいて項目変数を設定しますarray[index]
。
存在しない場合は終了であり、関数から戻ることができるため、永遠に続けようとはしません (これは再帰では非常に重要です)。
存在する場合は、アイテムの値をログに記録します。次に、まったく同じ関数を呼び出し、まったく同じ配列を渡しますが、 の値を渡しますindex + 1
。
これは誰かの人生を変えましたか、それともループを時代遅れにしましたか?
あまり。
しかし、これは再帰を得るための最初のステップです。
次のステップは、return
from 再帰を取得することです。
function recursiveAddOne (current, max) {
if (current === max) { return current; }
return 1 + recursiveAddOne(current + 1, max);
}
var total = recursiveAddOne(0, 3); // === 3 + 1 + 1 + 1
total; // 6
通常、return ステートメントでは、答えを外部の変数に送り返します。
私はまだそれをやっていますが、ここcall
ではリターンの一部として同じ関数に a を追加しています。
それは何をしますか?
内部関数が戻るまで、外部関数は値を返すことができません。
内部関数は、ITS 内部関数が戻るまで値を返すことができません...
...そして、私の終了条件が満たされるまでずっと下がります。その条件は、その外側の関数に値を返します。その外側の関数は、その追加された値を ITS の外側の関数に返します... ...最も外側の関数が、他のすべての関数をまとめた値を渡されるところまでずっと、それを外の世界に返します。
それは、ロシアのマトリョーシカ (「バブシュカ」) 人形に作品を与えるようなものです。
一番大きいものから始めて、一番小さいものまで入っていきます。
最も小さいものが最初に仕事をし、次の仕事にそれを返します.