Использование рекурсивных вызовов в программах на языке Си. Лясин Д.Н - 4 стр.

UptoLike

Составители: 

4
система уже не может создать очередного экземпляра локальных
объектов функции, что ведет, как правило, к аварийному завершению
программы.
Рекурсивные вызовы разделяют на прямые и косвенные. При
прямой рекурсии функция вызывает сама себя по следующему шаблону:
void func()
{
func();
}
При использовании косвенной рекурсии вызов осуществляется
опосредованно, через вызов другой функции:
void func1()
{
func(); //вызываем стороннюю функцию
}
int func()
{
func1(); //рекурсивно вызывается func1
}
В последнем примере, очевидно, косвенно вызываются как
функция func(), так и функция func().
Чтобы глубина рекурсии не была бесконечной, рекурсивный вызов
всегда подразумевает условие окончания (продолжения) рекурсии.
Поэтому рекурсивный вызов (как прямой, так и приводящий к
косвенному возврату) должен быть обусловлен:
void func()
{
if (условие_продолжения_рекурсии)
func();
}
Рекурсивный вызов по своему функциональному назначению близок
циклическому процессу: и в том и в другом многократно повторяются
некоторые действия. В некоторых языках программирования (например, в
функциональных) нет операторов цикла, их заменяет рекурсия.
Вернемся к рекурсивному определению алгоритма вычисления
факториала целого числа. Функция рекурсивного вычисления факториала
может быть такой:
unsigned int fact (unsigned int n)
система уже не может создать очередного экземпляра локальных
объектов функции, что ведет, как правило, к аварийному завершению
программы.
     Рекурсивные вызовы разделяют на прямые и косвенные. При
прямой рекурсии функция вызывает сама себя по следующему шаблону:
     void func()
     {
       …
       func();
       …
     }
     При использовании косвенной рекурсии вызов осуществляется
опосредованно, через вызов другой функции:
     void func1()
     {
       …
       func(); //вызываем стороннюю функцию
       …
     }
     int func()
     {
       …
       func1(); //рекурсивно вызывается func1
       …
     }

      В последнем примере, очевидно, косвенно вызываются как
функция func(), так и функция func().
      Чтобы глубина рекурсии не была бесконечной, рекурсивный вызов
всегда подразумевает условие окончания (продолжения) рекурсии.
Поэтому рекурсивный вызов (как прямой, так и приводящий к
косвенному возврату) должен быть обусловлен:
     void func()
     {
        …
        if (условие_продолжения_рекурсии)
          func();
        …
     }
     Рекурсивный вызов по своему функциональному назначению близок
циклическому процессу: и в том и в другом многократно повторяются
некоторые действия. В некоторых языках программирования (например, в
функциональных) нет операторов цикла, их заменяет рекурсия.
     Вернемся к рекурсивному определению алгоритма вычисления
факториала целого числа. Функция рекурсивного вычисления факториала
может быть такой:
     unsigned int fact (unsigned int n)



                                 4