C# の再帰関数では、再帰は英語と同じ意味を表すことを意味し、正確には繰り返しと呼ばれます。したがって、関数の再帰的な性質は、同じ作業を繰り返し実行することを意味します。そして、はい、プログラムが正しく処理されない場合、プログラムは間違いなく連続ループで実行されます。これらの再帰関数を実行する際には、必ず適切な条件を指定する必要があります。そうしないと、関数が何度もそれ自体を呼び出すことになり、プログラムが継続的に実行されることになります。ここで、C# でこれらの関数を作成する方法を見てみましょう。
ここでの構文は、C# の基本的な関数構文と同じです。ここを見てみましょう。
ここには特別な構文はありませんが、関数が戻り結果を提供する際にそれ自体を呼び出していることがわかります。そして、明らかに、停止しない実行コードは望ましくないため、これらのパラメータ値を再帰関数に渡す際には細心の注意を払う必要があります。
上記の構文では、return ステートメントでのみ関数を呼び出す必要はありません。むしろ、再帰関数の戻り値を変数に代入し、その変数も返すこともできます。
ここでは、再帰関数を生成するためのデフォルトの問題ステートメントである因数分解を取り上げます。
コード:
using System; class First { static void Main() { int result; result = fact(7); Console.WriteLine("Factorial is : " + result); } public static int fact(int num) { if(num==0) { return 1; } return num*fact(num-1); } }
段階的なプロセスを見てみましょう。
出力:
ここで、コード内で、関数のパラメーターを num マイナス 1 から num に置き換えます。 この場合、関数は何度もそれ自体を呼び出し、プロセスが繰り返されることになります。
コード:
using System; class First { static void Main() { int result; result = fact(7); Console.WriteLine("Factorial is : " + result); } public static int fact(int num) { if(num==0) { return 1; } return num*fact(num); } }
出力:
上記の出力から、関数がそれ自体を繰り返し呼び出しているスタック オーバーフロー例外がはっきりとわかります。最初のプログラムに対して、ハイライト部分のみが変更されます。
同様に、以下のように数値をユーザー入力値として作成できます:
コード:
using System; class First { static void Main() { int result,c; string a; Console.Write("Enter value for number :"); a = Console.ReadLine(); c = Convert.ToInt32(a); result = fact(c); Console.WriteLine("Factorial is : " + result); } public static int fact(int num) { if(num==0) { return 1; } return num*fact(num-1); } }
出力:
入力としてゼロを与えたらどうなるでしょうか?はい、1 つは返されます。
出力:
では、負の数を与えたらどうなるでしょうか?
出力:
階乗再帰関数が実行のたびにパラメータの値を減少させているため、スタック オーバーフロー例外も発生しました。したがって、負の数値は -6、-7、-8 などに減っていきます。それが、この例外を検討する理由です。
練習として、負の数に対する再帰関数を作成してみてはいかがでしょうか?
ヒント: ゼロ未満の数値の事前条件を取得し、ゼロになるまで再帰関数パラメーターに 1 を追加できます。
再帰関数に関して引用できる良い例はほとんどありません:
これらの再帰関数を使用できる場所が他にもいくつかあります。
ご覧のとおり、再帰関数はループの機能に似ていますが、同じ関数を繰り返し呼び出します。
プログラムが入力として与えられた 2 番目の数値を見つけるまで継続的に数値を追加する再帰関数をどのように作成できるかを見てみましょう。
コード:
using System; class First { static void Main() { int result,c,d; string a,b; Console.Write("Enter value for 1st number :"); a = Console.ReadLine(); c = Convert.ToInt32(a); Console.Write("Enter value for 2nd number :"); b = Console.ReadLine(); d = Convert.ToInt32(b); result = add(c,d); Console.WriteLine("Add is : " + result); } public static int add(int num1,int num2) { int sum ; sum=num1; if (num1 < num2 ) { num1++; sum=sum+add(num1,num2); return sum; } return sum; } }
ここで私たちがやったことは次のとおりです:
たとえば、num1 = 5 および num2 = 8 の場合、得られる出力の合計は 5+6+7+8、つまり 26 になります。
出力:
そして、num1 に num2 より小さい値を与えたらどうなるでしょうか?
出力:
最初に num1 値としていくつかを与え、合計値を num1 値に割り当て、if ステートメントが適用できない場合は合計を返します。
練習として、特定の条件を満たすまで「コーディングが好きです」を出力する再帰関数を作成できますか?
ヒント: 上記のプログラムで実行したのと同じ追加手順に従うことができます。
ここで、再帰関数の実行、これらの関数の呼び出し方法、およびそれらのいくつかの例を取得することに成功しました。また、関数の呼び出しにおける単純な違いによって、プログラムが限界を超えて実行され、例外が発生する可能性があることも学びました。
以上がC# の再帰関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。