Module: サブルーチン。再帰


Problem

5/12

再帰と反復

Theory Click to read/hide

再帰と反復
再帰を理解するには、再帰を理解する必要があります...
 
プログラミングにおける 反復 - 周期的なデータ処理プロセスの 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 />   <本体>
関数呼び出しには追加のオーバーヘッドがかかるため、非再帰階乗計算の方が若干高速になることを理解してください。

結論:
再帰なしで単純な反復アルゴリズムを使用してプログラムを作成できる場合は、再帰なしで作成する必要があります。しかしそれでも、計算プロセスが再帰によってのみ実装される問題の大きなクラスが存在します。
一方、再帰的アルゴリズムは多くの場合、より理解しやすいものです。

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 の桁数を計算する再帰関数を作成します。

再帰階乗関数 反復アルゴリズム
<プレ> static int Factorial(int n){ if (n > 1) n * 階乗 (n - 1) を返します。 それ以外の場合は 1 を返します。 } <プレ> int x = 1; for (int i = 2; i <= n; i++) x = x * i; Console.WriteLine("%d", x);
1
using System;   
2
class Program   
3
{    
4
    static int countDigits(int n)   
5
    {   
6
7
8
9
10
        return 1 + countDigits(n / 10);   
11
    }   
12
    static void Main()   
13
    {   
14
        int n = Convert.ToInt32(Console.ReadLine());   
15
        Console.WriteLine(countDigits(n));   
16
    }   
17
}   

     

Program check result

To check the solution of the problem, you need to register or log in!