ループ


/////////////////////////////////////////////////////////////////////////////////////
「繰り返し」という意味を表す言葉は、ループ(loop)、再帰(recursion)、遍歴(traversal)、反復(iterate)など多くある.
ループは最も基礎的な概念であり、コードを繰り返し実行することをループと呼ぶことができる.ほとんどの再帰、遍歴、反復は循環である.
再帰的な定義は、1つの(いくつかの)基本状況定義アルゴリズムに基づいて、他の複雑な状況を徐々に基本状況に還元することができる.プログラミングにおける特徴は、その関数を関数定義内で繰り返し呼び出すことである.例えば、フィボナッチ数列は、F(0)=1、F(1)=1を定義、その他の全ての場合:F(x)=F(x-1)+F(x-2)である.1より大きいすべての整数は、有限回の反転を経て、2つの基本的な状況に変換することができる.プログラミングでは、アルゴリズムは次のようになります.
int F(x)
{
    if(x==0 || x==1)
        return 1;    //          ,                 
    return F(x-1)+F(x-2);    //          ,           
}

反復は数学とプログラミングの中で異なる意味がある.反復(数学):循環の基礎の上で、毎回循環して、すべて前回より更に結果に接近します.例えば、反復例を以下に示す.
int result = 0;
for(int i=0; i<10; i++)
    result += i;    //       , result       45

多くの数学問題があり、ニュートン反復法(平方根を求める)のような反復アルゴリズムである.
反復(プログラミング):リスト内の各項目に順次アクセスし、多くのプログラミング言語でforeach文として表現されます.
$arr = [1, 2, 3, 4];
foreach($arr as $i)
    echo $i;

遍歴:一定の規則に従って1つの非線形構造の各項目にアクセスし、非線形構造(木、図)を強調する.反復は一般に線形構造(配列、キュー)に適用する.
結論
  • サイクル(loop)-最も基礎的な概念、すべての繰り返しの行為
  • 再帰(recursion)-関数内で自身を呼び出し、複雑な状況を基本状況
  • に徐々に変換します.
  • (数学)反復(iterate)-複数回のサイクルで結果
  • に徐々に近づく
  • (プログラミング)反復(iterate)-線形構造の各
  • に順次アクセス
  • 遍歴(traversal)-非線形構造の各
  • に規則的にアクセス
    ////////////////////////////////////////////////////////////////////////////////////////////
    再帰と反復の区別の関連付け
    ////////////////////////////////////////////////////////////////////////////////////////////
    再帰の基本概念:プログラム呼び出し自身のプログラミング技術を再帰と呼び、関数自身呼び出し自身である.
    1つの関数はその定義の中で直接あるいは間接的に自身の1種の方法を呼び出して、それは通常1つの大型の複雑な問題を1つの元の問題と似た規模の小さい問題に転化して解決して、コードの量を極めて減らすことができます.再帰的な能力は、限られた文でオブジェクトの無限の集合を定義することにある.
    再帰を使用する上で注意すべき点は2つあります.
    1)再帰はプロセスまたは関数内で自身を呼び出すことである.
    2)再帰を使用する場合、再帰出口と呼ばれる明確な再帰終了条件が必要である.
     
    再帰は2つの段階に分けられます.
    1)プッシュ:複雑な問題の解を元の問題より簡単な問題の解にプッシュする.
    2)回帰:最も簡単な状況を得た後、逐次戻り、順次複雑な解を得る.
     
    再帰を利用して多くの問題を解決することができます:例えばリュックサックの問題、ハンノタの問題、...等.
    フィボナッチ数列は0,1,2,3,5...
    fib(0)=0;
    fib(1)=1;
    fib(n)=fib(n-1)+fib(n-2);
    簡単な再帰呼び出しです再帰は一連の関数呼び出しを引き起こし、一連の繰り返し計算がある可能性があるため、再帰アルゴリズムの実行効率は比較的低い.
     
     
    反復:変数の元の値を利用して変数の新しい値を推定する.再帰が自分で自分を呼び出すなら、反復はAの絶え間ない呼び出しBである.
    再帰には必ず反復があるが、反復には必ずしも再帰があるとは限らず、大部分は互いに変換することができる.反復的な再帰的でない、再帰的に関数を呼び出すことができ、空間を浪費し、再帰が深すぎるとスタックのオーバーフローを引き起こしやすい.
        //      
        int funcA(int n)  
        {  
            if(n > 1)  
               return n+funcA(n-1);  
            else   
               return 1;  
        }  
        //      
        int funcB(int n)  
        {  
            int i,s=0;  
            for(i=1;i