2016-12-22 7 views
2

この質問は、説明的な用語 "再帰"または "再帰的"に関する曖昧さ回避のための標準的な質問/回答として意図されています。適用可能な範囲では、「それ自体を参照する非終了手続き」および「繰り返しスケジューリング」。 JavaScript「再帰」、「終了しないプロシージャ」、「繰り返しスケジューリング」の違いは何ですか?


  1. "再帰" の間の定義との違いは何ですか。
  2. "自分自身を参照する非終了手続き";そして
  3. 「繰り返し予約」
私はしばしば JavaScriptで「再帰」の明確な定義は何ですが、関数が呼び出し自体を繰り返した際に使用される用語「再帰」を参照してください

関数のパターンを記述するときに使用される「自分自身を参照する非終了プロシージャ」または「繰り返しスケジューリング」という用語をほとんど見たことがありません。頻繁に "再帰的"または "再帰"は、関数呼び出しの本体の中でプロセスを開始した元の関数に関数呼び出しが行われるパターンを記述するために使用されます。

特定の機能パターンに「再帰」が適用されないのはいつですか。 「再帰」、「それ自身を参照する非終了プロシージャ」、「繰り返しスケジューリング」の明確な定義と区別は何ですか?

+1

なぜJavaScriptでその定義が異なると思いますか? – Bergi

答えて

2

再帰

何がJavaScriptで「再帰」の明確な定義ですが、私は多くの場合、関数が呼び出し自体を繰り返した際に使用される用語「再帰」を参照してください?

この定義はうまくいくようですが、関数は再帰的に呼び出される必要はありません。実行すると、呼び出されるようになります。関数が直接呼び出されない再帰の例は次のとおりです。を呼び出すB();を呼び出すC();を呼び出すと、A();が再び呼び出されます。このような

繰り返し予約

機能は、繰り返し予約を使用しています:Aは、同じコールスタック上で繰り返し呼び出されていないため、

function A (foo) { 
    var bar; 
    setTimeout(A, 0); 
    console.log('hello'); 
} 

それは再帰的ではありません。現在のコールスタックが終了すると(つまり、 'hello'がログに記録されていることを意味します)、イベントループでAを呼び出す前にAが呼び出されます。同期コードと非同期コードの違いとは別に、一度にfoobarのコピーが1つしかなく、呼び出しスタックが成長していないため、メモリまたは最大呼び出しスタックサイズはなくなります再帰を使用して、このバージョンのために存在することになる超えたエラー、:それはloggingステートメントに到達する前にAは自分自身を呼び出すので、その場合には

function A (foo) { 
    var bar; 
    A(); 
    console.log('hello'); 
} 

は「ハロー」印刷されません。それ自体

非終了手順を参照

A非終端プロシージャだけ無限ループです。それ自体を参照することは意味がありません。

function A () { 
    // Never terminates 
    while (true) { 
     // If A() is called here, or before 
     // the loop you have infinite 
     // recursion and a stack size error 
    } 
    // If, instead, A() is called here, 
    // you just have an infinite-loop, 
    // since this statement is never reached 
} 
+0

第3の例は、スタック・サイズ・エラーが回避される最初の例とどのように違うのですか?たとえばwhile文の中のある時点で 'break'を使用し、' while'ループの後に 'A()'が呼び出されます。将来の再帰のある時点で元の関数の非同期呼び出しですか?または、元の関数が再度呼び出される前に、関数呼び出しに非同期関数呼び出しが含まれている場合、別の評価がありますか? – guest271314

+0

3番目の例は、ブレークが追加され、ループの後に 'A();'が呼び出された場合、再帰と違いはありません。スタックサイズエラーが発生します。 – Paulpro

+0

"将来の再帰のある時点で元の関数の非同期呼び出しですか?いいえ(繰返しスケジューリングの例を参照)。 「元の関数が再び呼び出される前に、関数呼び出しに非同期関数呼び出しが含まれていると、別の評価がありますか?それは不可能です。すべての非同期関数は、呼び出しスタックが完了した後に実行されます。非同期コードの後に​​同期コードを実行することはできません。 – Paulpro

関連する問題