А рекурсивный метод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();

}

}

Вот к какому результату приводит выполнение этого кода.

Исходная строка: Это тест Перевернутая строка: тсет отЭ

Перейти на страницу:

Похожие книги