Шаг 37.
Основы языка PHP.
Рекурсия

    На этом шаге мы рассмотрим понятие рекурсии.

    В программировании имеется понятие "рекурсия".

    Например, попробуем написать функцию с помощью обычного цикла for, возвращающую факториал числа. Он вычисляется следующим образом: n!=1*2*...*(n-1)*n. Причем 0! = 1 и 1! = 1, а факториала отрицательных чисел не бывает. Напишем функцию нахождения факториала числа без рекурсии.

<?php
function factorial ($num)
   {
   if ($num < 0)
      {
      return 0;
      }
   if ($num == 0)
      {
      return 1;
       }
   for ($i = 1, $sum = 1; $i <= $num; $i++)
      {
      $sum = $sum * $i;
      }
    return $sum;
   }
echo factorial(3);   //выведет 6
?>

    В этом случае выводится число 6. Задача решена, как говорится, "в лоб". В случае передачи отрицательных значений функция будет возвращать 0. Это реализуется с помощью первого оператора if. Если передано число 0, то возвращаем единицу. При любых других значениях факториал вычисляем в цикле for.

    При решении задач с помощью рекурсии требуются рассуждения иного рода. Например, факториал числа можно вычислить следующим образом:

n! = 1, если n = 0 и n = 1,
n! = n*(n-1)!, если n>0.

    Заметьте, что второе утверждение содержит в себе знак факториала. Именно в этом и состоит основной смысл рекурсии. При решении определенной задачи мы используем то, что нам нужно найти. В программировании функцию называют рекурсивной, если в ее описании присутствует обращение к самой себе.

    Итак, вернемся к задаче о факториале числа. При решении задач с помощью рекурсии всегда надо иметь два типа утверждений: базисное и рекурсивное. В нашем случае базисным утверждением является n! = 1 если n = 0 или n = 1. Эти значения называются точками останова. Работая с рекурсивным утверждением, мы должны перейти к базисному и получить результат. Теперь напишем функцию нахождения факториала числа с использованием рекурсии.

<?php
function factorial ($num)
   {
   if ($num < 0)
      {
      return 0;
      }
   if ($num == 0)
      {
      return 1;
      }
   return $num*factorial($num-1);   // рекурсивный вывод
   }
echo factorial(3);                  // выведет 6
?>

    В этом случае первые два условия взяты из предыдущего примера. Но теперь вместо цикла for мы записываем рекурсивное выражение, в котором функция вызывает сама себя. В нашей программе это происходит до тех пор, пока в качестве входного параметра не будет число 0, при котором функция возвратит 1. Причем это значение возвратится не в основную программу, а в тело предыдущей функции. Эта функция, в свою очередь, возвратит свое значение в тело следующей функции и т.д., пока нужное значение не возвратится в основную программу.

    Со следующего шага мы начнем знакомиться с массивами.




Предыдущий шаг Содержание Следующий шаг