再帰と反復
再帰を理解するには、再帰を理解する必要があります...
プログラミングにおける
反復
- 周期的なデータ処理プロセスの
1 ステップ。
多くの場合、現在のステップ (反復) での反復アルゴリズムは、前のステップで計算された同じ操作またはアクションの結果を使用します。 そのような計算の一例は漸化関係の計算です。
再帰的な値の簡単な例は階乗です:
\(N!=1 \cdot 2 \cdot 3 \cdot \ ... \ \cdot N\)。
各ステップ (反復) での値の計算は
\(N=N \cdot i\) です。
\(N\) の値を計算するときは、すでに保存されている値
\(N\) が使用されます。 >.
数値の階乗は、
漸化式
を使用して記述することもできます。
\(\begin{equation*} n!= \begin{cases} 1 &\text{n <= 1,}\\ (n-1)! \cdot n &\text{n > 1.} \end{cases} \end{equation*}\)
この説明は単なる再帰関数に過ぎないことに気づくかもしれません
。
ここで、最初の行 (
\(n <= 1\)) は基本ケース (再帰終了条件) であり、2 行目は次のステップへの移行です。 < br />
<本体>
再帰階乗関数 |
反復アルゴリズム |
int 階乗(int n)
{
if (n > 1)
n * 階乗 (n - 1) を返します。
それ以外の場合は 1 を返します。
}プレ>
|
x = 1;
for (i = 2; i <= n; i++)
x = x * i;
cout << x;
|
表>
関数呼び出しには追加のオーバーヘッドがかかるため、非再帰階乗計算の方が若干高速になることを理解してください。
結論:再帰なしで単純な反復アルゴリズムを使用してプログラムを作成できる場合は、再帰なしで作成する必要があります。しかしそれでも、計算プロセスが再帰によってのみ実装される問題の大きなクラスが存在します。
一方、再帰的アルゴリズムの方が理解しやすい場合が多い
です。
Problem
与えられた自然数
n
の桁数を返す関数
K(n)
を次のように定義します
\(\begin{equation*} K(n) = \begin{cases} 1 &\text{if n < 10}\\ K(n / 10) + 1 &\text{if n >= 10} \end{cases} \end{equation*}\).
上記の比率を使用して、自然数
n
の桁数を計算する再帰関数を作成します。
Запрещенные операторы: for;while;until