- 末尾再帰と末尾再帰の機能は何ですか
- 最後のアプリケーション関数呼び出しと末尾再帰
まず、テールと末尾再帰関数呼び出しは何ですか
最後のステップは、関数の終了を呼び出すことがある別の関数を呼び出す関数を指します。
1 // 尾コール例に機能 2 関数FOO(X){ 3 リターンG(X)を、 4 } 5。 // 最後に第二の機能例を呼び出す 6。 機能ファン(X){ 7。 IF(X> 0 ){ 8。 復帰G (X); 9 } 10 リターンY(X); 11 }
最後のステップと、コードの最後の行の間の差を呼び出すコードは、必ずしもこのような第2の例として、最後の行の最後のステップではありません。ここでは末尾呼び出し呼び出すことはできませんこのような機能があります:
図1は、 // 関数呼び出しの終わりに従うと呼ばれるこのようなケースではありません 2 関数FU(X){ 3。 VAR Y = 10 * X; 4 G(Y); 5 }
なぜこれが尾呼び出されていない機能はそれを呼び出すのですか?その理由は、最後のステップは、関数のリターン命令を実行することであるので、命令は2つの機能を有する、第一の機能は、現在の実行を終了する機能であり、第二の機能は、命令(関数の戻り値)をバックデータを転送することで、簡単です。この戻りコマンドは宣言の有無にかかわらず実行されますと、ケースデータの声明なしで返さは定義されていませんので、上記のコードは、実際には次のような構造です。
1つの 関数FU(X){ 2 VARの Y = 10 * X。 3 G(Y) 4 返す未定義。 5 }
リターン命令の機能が停止してから、データを返すことです。ない最後のステップ関数の末尾呼び出しが発生した場合ここでは、問題につながりますか?リターン命令は、何が起こるか、以下の場合、続いて?
1 // 数の階乗 2 関数{階乗(N-) 3 IF - (=== === 0〜N-1 || N)リターン 1 ; 4。 復帰 * N-階乗(N - 1 ); 5。 }
最後のステップは、計算の産物ではなく、純粋に関数呼び出しであるため、この数以上の階乗アルゴリズムの例は、関数呼び出しの終了と呼ばれることができません。
第二に、アプリケーションが機能テールと末尾再帰を呼び出し、
基本的に実行された最後のあるステップ関数の末尾呼び出しの復帰命令、リターンデータのこの部分は、関数の実行です。この一見単純な命令とその簡単な機能と何も特別な。関数が実行されたときしかし、それが一般に呼ばれる、メモリ内の「通話記録」を形成します「呼び出しフレーム。」関数が内部的に実行呼び出されたときに復帰命令の後に関数呼び出しが別の関数呼び出しスタックを生成しますので、それはリターン命令がトリガする前に呼び出される関数であることに注意してください、代わりのコールスタック上の元の関数の呼び出しを追加フレーム。
ブラウザのスペースが限られたリソースであるまで、私たちは関数が大きなループネスト関数呼び出しを表示された場合、ネストされた各関数呼び出しは、元の関数を呼び出します、それはコールスタックメモリ機能が制限されている、メモリを割り当てますそして、もし、引数、その後大きなポイント、それは、コールスタックの階乗関数に99コール・フレームを持つことになり、入ってくるパラメータが100である場合は、上記の数値の階乗のように、スタックの呼び出しフレームの上に追加しますか?1000年以上、この無限のスタックは確かにスタックオーバーフローのリスクをもたらす可能性があります。
次の例を見てください:
1 関数(N){FB 2 IF(N-N- || 1 == == 2 ){ 3 リターン 1 。4 } 。5 リターン FB(N - 1)FB +(N - 2 ;) 。6 } 。7はconsole.log( FB(100)); // スタックオーバーフロー、ブラウザがクラッシュ
上記の例(フィボナッチ数)多重媒介問題と同じアルゴリズムが計算関数のすべての結果の顔のリターン命令の後ことがあり、これが実際に発生が現在の関数ではなく、関数で計算される有しますロジックが停止します輸出プログラムの遵守まで、コールスタックの呼び出しフレームを増やします。しかし、計算された値に達したときに、特定のレベルは、ベンの崩壊にブラウザを引き起こし、スタックオーバーフローが発生します。
復帰命令の後に自分自身を呼び出して、実際には、末尾再帰が何であるかを明確な決意がなかった、何も解決できない、それが機能を実行するためにある、と述べました。ここでは、デフォルトのパラメータ末尾再帰とESソリューション呼び出しフレームの階乗とフィボナッチアルゴリズムコラムオーバーフローの問題の使用は次のとおりです。
1 // 階乗実現使用デフォルトES6 +テール再帰アルゴリズム 2 関数 factorial1(N、合計= 1 ){ 3。 IF(N-1 || N - === === 0)を返す合計; 4。 N - + = 1 ; 5 リターン階乗(N-- 1、N- *。トータル); 6 } 7。 // 数フィボナッチ列アルゴリズムのES6 +テール再帰実装数のデフォルト値は 8。 関数 FB1(N、ACL = 1、AC2 = 1。。{) 9。 IF(N-N - === === 2 || 1)戻りAC2、 10 リターン FB1(N - 1、AC2、ACL + AC2); 11 }
ルアンYifengの先生「ES6標準のエントリ - 第三版」P127では、教師は2つのアルゴリズムは、このような5の教師階乗階乗として値を、計算、計算小さい見つかった24の結果であり、この結果は私のスタートになり困惑、個人教師のアイデアは、インデックスパラメータは、結果は計算値を設定する場合、インデックスパラメータを使用して階乗結果が指定する指定で計数コンピュータ(0から始まる)、に従って推定されます。また、私を修正してください何か間違った場所があれば、私は、この推測が正しいか分かりません。
そして、私が例で使用階乗結果値、階乗ない結果テーブルインデックスです。