再帰的アルゴリズムは、非再帰的なアルゴリズムを変換し、

転送:https://blog.csdn.net/fbz123456/article/details/50959412  
 

再帰アルゴリズムは、実際には単純な問題に複雑な問題を解決するために、分割統治アプローチ、です。特定の複雑な問題(例えば問題hanioカラム)のために、再帰的なアルゴリズムは、問題を解決することが望ましく、天然および論理的な方法であるが、効率が通常貧弱再帰的なアルゴリズムです。そのため、多くの場合、問題を解決するために、問題を分析するために非再帰的アルゴリズムを再帰的なアルゴリズムを使用して、特定の問題を解決する上で、また、いくつかのプログラミング言語は、非再帰的アルゴリズムに再帰的なアルゴリズムを必要と再帰をサポートしていません。
    他の直接評価されていない、必要なバックトラック、非再帰的アルゴリズムに再帰アルゴリズムは、二つの方法、一方は直接評価(反復/サイクル)され、ノーバックトラックがあります。いくつかの変数を使用して、前者の中間結果は、直接変換方式と呼ばれ、間接変換方式として知られている中間結果を使用してスタックが、二つの方法を以下に説明します。

1.直接変換方式は、
直接末尾再帰法は、通常、代わりにループ構造を有する再帰、再帰構造を除去し、一方向ために使用される変換します。
再帰的な方法:今度は単純に再帰的プロセスを意味する一つの方向に常にあり、関数は機能2 1を呼び出す場合、2及び機能は、関数1を呼び出し、ケースは一方向の再帰に属していません。再帰溶液のフィボナッチ数は、反復法によって実現転送することができます。

再帰的なソリューションのフィボナッチ数:

INTのFib(INT N){
IF(N <= 1)戻りN。
他のFibを返す(N - 1)+のFib(N - 2)。
}

反復解法へ:

INTのFib(INT N){
IF(N <= 1)戻りN。
int型twoBack = 0;
int型oneBack = 1;
int型のCUR。
{(; iが<= N I ++はiは2 = INT)のための
   CUR = twoBack + oneBack。
twoBack = oneBack。
   oneBack = CUR。
}
CURを返します。
}

末尾再帰関数は再帰的な方法で終わる再帰関数呼び出しである特殊なケースです。これは、再帰呼び出しの唯一の文で、プロセスの最後に配置されます。ときに再帰呼び出しが戻ると、文の次の文1つの再帰呼び出しに復帰し、この位置は、プログラムの終了間際であるので、再帰スタックが保存されたリターンアドレスを動作しないことがあり、戻り値と基準値を除いて、他のパラメータ、およびローカル変数は、もはや必要とされていませんので、スタックは、直接、非再帰的プロセスを使用してサイクルを書き込むことはできません。

階乗関数は末尾再帰的ではありません。それは再帰呼び出しの結果を受け取った後、あなたは再びそれを行う呼び出しを返す前に乗算しなければならないので。しかし階乗関数は、例えば、尾再帰関数に変換することができます。

再帰的なソリューションの階乗:

int型階乗(int型のn)

{
IF(N == 0)リターン1。

     {
int型のval =階乗(N - 1)。
n個の* valを返します。
}
}

末尾再帰ソリューションに変換:

int型の階乗(int型ACC、int型x)は、

 {// 1のACC送信値。
IF(X <= 1)ACCを返し、
そうでなければ

     階乗を返す(Xの*のACCを、X - 1)。
}

重要性は、末尾再帰末尾呼び出し、呼び出し側の戻り位置は、コールスタックに存在している必要はないときということです。ときブランチ直接以前に保存されたリターンアドレスへの再帰呼び出しが戻ります。そのため、時間と空間でのサポート末尾再帰の最適化コンパイラ、末尾再帰では、より費用対効果の高いです。反復アルゴリズムはない機能再帰関数呼び出しとして考慮すべき間違いなく支出の可読性を下げるために導いた一時変数、反復関数プログラムを必要とするだけでなく、スレッドのスタック領域のために利用できるヒープ領域よりも小さいため、通常は入手可能ですより多くの、そして再帰的アルゴリズムは比較的反復アルゴリズムは、多くのスタック領域を必要としています!

2.間接変換方式
再帰関数に従って得られた中間結果を保存するスタックを使用して、一般的に実行スタックの変更中に必要とされます。次のようにその一般的なプロセスは次のとおりです。

初期状態S0プッシュは、
(スタックが空でない)しながら
{
デは、積み重ねられた、上部要素をSに割り当てられ、
IF(S結果が探している)が返され、
そうでなければ{
SにS1関連状態を見つけ、
プッシュS1を
}
}

間接変換方式は、図非再帰などの非バイナリツリートラバーサルアルゴリズムの再帰的深さ優先トラバーサルアルゴリズムのようなデータ構造で多くのインスタンスを有し、メイン教育関連するコンテンツを読者に参照します。
 

おすすめ

転載: blog.csdn.net/qq_38446366/article/details/89499257