Объектно-ориентированное программирование на С#. Андрианова А.А - 43 стр.

UptoLike

43
4.2.2. Рекурсивные методы
Рекурсивные методы это функции, в теле которых содержится вызов
самих себя. Обычно их используют в ситуациях, когда легко свести
исходную задачу к задаче того же вида, но с другими исходными данными,
например, уменьшение размерности задачи, переход в новую точку и пр.
Каждый новый вызов рекурсивного метода предполагает сохранение
состояния всех переменных в специальной области памяти. После
выполнения рекурсивного метода, управление передается оператору,
следующему за его вызовом. При этом состояние всех переменных
восстанавливается. Поэтому применение таких методов считается очень
затратным с точки зрения памяти и не подходит для решения задач большой
размерности. Тем не менее, существует множество задач, в которых
рекурсивные алгоритмы более просты и дают компактные программы.
Следует помнить, что любой рекурсивный метод должен иметь
обязательное условие выхода из рекурсии. При выполнении этого условия
управление передается в место предыдущей итерации, откуда произошел
рекурсивный вызов или в вызывающую функцию.
Далее приведем несколько примеров.
Пример 1. Вычислить n! .
Когда рекурсия заключается в сведении к задаче меньшей размерности,
алгоритм аналогичен обратному ходу метода математической индукции.
Очевидно, что n!=n*(n-1)! Эта формула и определяет основное
рекуррентное соотношение (n-1)! вычисляется с помощью вызова функции
с фактическим параметром, принимающим значение n-1. Условие выхода из
рекурсии – это сведение задачи к тривиальному случаю – 1!=1, 0!=1.
class Program
{
// метод поиска факториала целого числа
static uint Factorial(uint n)
{
// условие выхода из рекурсии
if(n==1 || n==0)
return 1;
return n*Factorial(n-1);// рекурсивный вызов
}
static void Main(string[] args)
{
uint n;
                                  4.2.2. Рекурсивные методы

      Рекурсивные методы – это функции, в теле которых содержится вызов
самих себя. Обычно их используют в ситуациях, когда легко свести
исходную задачу к задаче того же вида, но с другими исходными данными,
например, уменьшение размерности задачи, переход в новую точку и пр.
      Каждый новый вызов рекурсивного метода предполагает сохранение
состояния всех переменных в специальной области памяти. После
выполнения рекурсивного метода, управление передается оператору,
следующему за его вызовом. При этом состояние всех переменных
восстанавливается. Поэтому применение таких методов считается очень
затратным с точки зрения памяти и не подходит для решения задач большой
размерности. Тем не менее, существует множество задач, в которых
рекурсивные алгоритмы более просты и дают компактные программы.
      Следует помнить, что любой рекурсивный метод должен иметь
обязательное условие выхода из рекурсии. При выполнении этого условия
управление передается в место предыдущей итерации, откуда произошел
рекурсивный вызов или в вызывающую функцию.
      Далее приведем несколько примеров.
      Пример 1. Вычислить n! .
      Когда рекурсия заключается в сведении к задаче меньшей размерности,
алгоритм аналогичен обратному ходу метода математической индукции.
      Очевидно, что n!=n*(n-1)! Эта формула и определяет основное
рекуррентное соотношение – (n-1)! вычисляется с помощью вызова функции
с фактическим параметром, принимающим значение n-1. Условие выхода из
рекурсии – это сведение задачи к тривиальному случаю – 1!=1, 0!=1.

  class Program
  {
     // метод поиска факториала целого числа
     static uint Factorial(uint n)
    {
        // условие выхода из рекурсии
        if(n==1 || n==0)
           return 1;
        return n*Factorial(n-1);// рекурсивный вызов
    }

     static void Main(string[] args)
     {
        uint n;
                                                                       43