А рекурсивный метод
FactR действует по более сложному принципу. Если методFactR вызывается с аргументом 1, то он возвращает значение 1. В противном случае он возвращает произведениеFactR(п-1) *п. Для вычисления этого произведения методFactR вызывается с аргументомп-1.Этот процесс повторяется до тех пор, пока значение аргументапне станет равным 1, после чего из предыдущих вызовов данного метода начнут возвращаться полученные значения. Например, когда вычисляется факториал числа 2, то при первом вызове метода FactR происходит второй его вызов с аргументом 1. Из этого вызова возвращается значение 1, которое затем умножается на 2 (первоначальное значение аргумента п). В итоге возвращается результат 2, равный факториалу числа 2 (1x2). Было бы любопытно ввести в метод FactR операторы, содержащие вызовы метода WriteLineO, чтобы наглядно показать уровень рекурсии при каждом вызове метода FactR , а также вывести промежуточные результаты вычисления факториала заданного числа.Когда метод вызывает самого себя, в системном стеке распределяется память для новых локальных переменных и параметров, и код метода выполняется с этими новыми переменными и параметрами с самого начала. При рекурсивном вызове метода не создается его новая копия, а лишь используются его новые аргументы. А при возврате из каждого рекурсивного вызова старые локальные переменные и параметры извлекаются из стека, и выполнение возобновляется с точки вызова в методе. Рекурсивные методы можно сравнить по принципу действия с постепенно сжимающейся и затем распрямляющейся пружиной.
Ниже приведен еще один пример рекурсии
DisplayRev.
// Вывести символьную строку в обратном порядке, используя рекурсию.
using System;
class RevStr {
// Вывести символьную строку в обратном порядке, public void DisplayRev(string str) { if (str.Length > 0)
DisplayRev(str.Substring(1, str.Length-1)); else
return;
Console.Write(str[0]);
}
}
class RevStrDemo { static void Main {
string s = "Это тест"; ,
RevStr rsOb = new RevStr ;
Console.WriteLine("Исходная строка: " + s);
Console.Write("Перевернутая строка: "); rsOb.DisplayRev(sf;
Console.WriteLine;
}
}
Вот к какому результату приводит выполнение этого кода.
Исходная строка: Это тест Перевернутая строка: тсет отЭ