プロシージャまたは関数には、その中に別のプロシージャへの呼び出しが含まれる場合があります。サブルーチン自体を呼び出すこともできます。この場合、コンピュータは気にしません。また、彼はいつものように、出会った命令を上から下まで一貫して実行します。

数学を覚えているなら、そこで数学的帰納法の原理に出会うことができます。それは以下の通り
です。
特定のステートメントは、すべての自然なn に当てはまります。
    1.n = 1 および
の場合に有効です。     2. 任意の自然な n = k に対するステートメントの妥当性から、n = k+1
に対してそれが真であることがわかります。
プログラミングではこの手法を再帰
と呼びます。
再帰は、指定された単純な基本ケースに基づいて、セット自体に関してオブジェクトのセットを定義する方法です。


再帰的は、それ自体を直接、または他のプロシージャや関数を通じて呼び出すプロシージャ (関数)とも呼ばれます
再帰的プロシージャの例: <プレ> <コード>プロシージャ Rec(a: 整数); 始める     >の場合0 その時         Rec(a - 1);    書き込み(a); 終了; 再帰の作業はフローチャートで概略的に表すことができます。

 
Rec() プロシージャはパラメータ 3 で実行されます。次に、パラメータ 3 のプロシージャ内でパラメータ 2 のプロシージャが呼び出され、パラメータ 0 のプロシージャが呼び出されるまで同様に続きます。パラメータ 0 が呼び出された場合、再帰呼び出しはすでに行われず、パラメータ 0 を持つプロシージャは数値 0 を出力して終了します。次に、制御はパラメータ 1 を持つプロシージャに戻り、数値 1 を出力して作業を終了します。パラメータ 3 のプロシージャの前。

呼び出されたすべてのプロシージャは、作業が完了するまでメモリに保存されます。同時プロシージャの数は、再帰の深さと呼ばれます。

再帰とは、サブルーチンに含まれる命令を繰り返し実行することです。そして、これはサイクルの働きに似ています。 Prolog など、ループ構造がまったくないプログラミング言語もあります。 
for ループの動作をシミュレートしてみましょう。
for ループにはステップ カウンター変数が含まれています。再帰サブルーチンでは、このような変数をパラメーターとして渡すことができます。 <プレ> //2 つのパラメータを持つ LoopImitation() プロシージャ //最初のパラメーター –ステップ カウンター、2 番目のパラメーター –総ステップ数 手続き LoopImitation(i, n:整数); 始める     writeln('こんにちは N ', i); // i の任意の値に対して繰り返される演算子    もし私が< n then //ループ カウンタが値 n と等しくなるまで、         LoopImitation(i + 1, n); // パラメータ i+1 を使用してプロシージャの新しいインスタンスを呼び出します (次の値 i への遷移) 終わり;

再帰を理解するには、再帰を理解する必要があります...
 
プログラミングにおける反復—広い意味では、データ処理の組織。(%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F" title="再帰" とは異なり、自身への呼び出しを引き起こすことなく、アクションが何度も繰り返されます) > 再帰)。狭義では、ワンステップの循環データ処理プロセス。
多くの場合、現在のステップ (反復) での反復アルゴリズムは、前のステップで計算された同じ操作またはアクションの結果を使用します。  そのような計算の一例は漸化関係の計算です。 
再帰的な値の簡単な例は階乗です: \(N!=1 \cdot 2 \cdot 3 \cdot \ ... \ \cdot N\) 各ステップ (反復) での値の計算は \(N=N \cdot i\) です。 \(N\) の値を計算するときは、すでに保存されている値\(N\) が使用されます。 >.

数値の階乗は、漸化式を使用して記述することもできます。



この説明は単なる再帰関数に過ぎないことに気づくかもしれません
。 ここで、最初の行 (\(n <= 1\)) —これは基本ケース (再帰の終了条件) で、2 行目は次のステップへの移行です。
  <本体>
関数呼び出しには追加のオーバーヘッドがかかるため、非再帰階乗計算の方が若干高速になることを理解してください。
結論:
再帰なしで単純な反復アルゴリズムを使用してプログラムを作成できる場合は、再帰なしで作成する必要があります。しかしそれでも、計算プロセスが再帰によってのみ実装される問題の大きなクラスが存在します。
一方、再帰的アルゴリズムの方が理解しやすい場合が多い
です。  

再帰階乗関数は次のようになります 通常の非再帰的な方法で階乗を求めるアルゴリズムを比較します
関数 Factorial(n: 整数): 整数;
始める
    n > の場合1 その後
       階乗 := n * 階乗(n - 1)
   その他
       階乗 := 1;
終了;
x := 1;
for i := 2 to n do
    x := x * i;
writeln(x);