ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript の再帰とループのそれぞれの利点をコードで詳しく説明します。

JavaScript の再帰とループのそれぞれの利点をコードで詳しく説明します。

伊谢尔伦
伊谢尔伦オリジナル
2017-07-26 17:37:471720ブラウズ

再帰とループ

繰り返し計算を必要とするさまざまなタイプの問題に対して、ループおよび再帰手法にはそれぞれ利点があり、より直観的でシンプルな解決策を提供できます。一方、ループメソッドと再帰メソッドは相互に変換できます。コードのループは再帰を使用して書き換えることができ、その逆も可能です。一般性を失うことなく、ループと再帰は次の疑似コードを使用して要約できます。

疑似コード形式の説明: ループは while 形式を採用しており、変数の割り当ては次のとおりです:=; 条件式と実行されるステートメントは関数の形式で記述され、関連する値は括弧内に記述されます。その他の構文に関しては、JavaScript の仕様にできるだけ近づけるようにしてください。

//pseudo code of a loop 
//while形式 
function loop(arguments){ 
//结果的初始值 
result:=initial_value; 

while(condition(variable, arguments)){//循环条件,可能只需arguments,也可能为了方便引入循环变量 
//计算结果。参数包括之前的结果、当前循环变量和外部变量 
result:=calculate(result, variable, extern_variables); 
//影响函数的外部环境,即修改外部变量 
changeStatus(result, variable, extern_variables); 
//执行完循环体中的语句后,修改参数或循环变量。 
modify_arguments_variable(arguments, variable); 
} 
//返回结果 
return result; 
}

同様に、再帰関数の擬似コードを与えます。

//pseudo code of a recursion 
function recursion(arguments){ 
//以下代码为控制函数重复调用的结构部分。 
//获得再次调用此函数的新的参数,可能为多组arguments值。 
//对应于循环中的condition(variable, arguments)和modify_arguments_variable(arguments, variable)。 
new_arguments:=conditional_get_next(arguments); 
//对新参数的每一组,调用函数自身。 
results:=recursion(new_arguments); 
//以下的代码为每次调用都运行的功能部分 
//计算结果。涉及到之前的结果、当前循环变量和外部变量。 
//对应于循环中的result:=calculate(result, variable, extern_variables)。 
result:=calculate(arguments, extern_variables); 
result:=combine(result, results); 
//影响函数的外部环境,即修改外部变量 
changeStatus(result, arguments, extern_variables); 
return result; 
}

2 つのコードを比較すると、ループと再帰が似たような構成になっていることがわかります。順序を変更し、適切な変換を行うことで、任意のループを再帰的な方法で実装できます。プログラムが単純な場合、この変化は簡単に確認できます。たとえば、次の単純な累積和関数:

//loop 
function sum(num){ 
var result=1; 
while (num>1){ 
result+=num; 
num--; 
} 
return result; 
}

対応する再帰形式:

//recursion 
function sum2(num){ 
if (num>1){ 
return num+sum(num-1); 
}else{ 
return 1; 
} 
}

逆に、ほとんどの再帰プログラムはループによって直接実装することもできます。以下は、最大公約数を見つけるループ形式の関数です。

function gcd2(a, b){ 
var temp; 
if (a<b){ 
temp=a; 
a=b; 
b=temp; 
} 
var c=a%b; 
while (c!==0){ 
a=b; 
b=c; 
c=a%b; 
} 
return b; 
}

ただし、再帰からループへの変換は必ずしも簡単ではありません。この関数を再度呼び出すための新しい引数を生成する再帰擬似コードの部分

new_arguments:=conditional_get_next(arguments);

は、ループの対応する部分よりも柔軟です。再帰は、新しく生成されるパラメータ グループの数に応じて 2 つのカテゴリに分類できます (関数に必要なパラメータはすべて 1 つのグループです)。 1 つ目のタイプは、パラメータ グループの数が固定されており、フィボナッチ数列や最大公約数の例など、再帰をループに変換できる場合です。2 つ目のタイプは、パラメータ グループの数が不確実な場合です。グラフまたはツリーを走査するとき このように、各点には任意の数の隣接点があります。この再帰を直接ループに変換することはできません。

ループは 1 次元の繰り返ししか実行できないのに対し、再帰は 2 次元の構造を横断できるからです。たとえば、ツリーでは、ノードにはその子ノードと同じレベルのノードの両方があります。単純な 1 次元ループは両方向に移動できません。 ただし、ループ内のデータ構造を利用してノードの位置に関する情報を覚えていれば、2 番目のタイプの再帰をループで実装することもできます。

要約すると。すべてのループは再帰を使用して実装できます。すべての再帰はループを使用して実装できます。どの方法が使用されるかは、特定の問題およびユーザーの好みに対して、どちらのアイデアがより便利で直観的であるかによって決まります。

以上がJavaScript の再帰とループのそれぞれの利点をコードで詳しく説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。