П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 6547 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 8673 раз(а).

Учебник HTML.
Просмотров 5259 раз(а).

Руководство по PHP5.
Просмотров 2418 раз(а).

Хостинг через призму DNS.
Просмотров 7700 раз(а).

Подборка текстов стандартных документов.
Просмотров 261 раз(а).

Учебник PHP - Самоучитель
Просмотров 5524 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 11749 раз(а).

Внешние атаки...
Просмотров 7981 раз(а).

Учебник PHP.
Просмотров 4645 раз(а).

SSI в примерах.
Просмотров 1453 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь





Функции

Что такое рекурсия



Рекурсией называется такая конструкция, при которой функция вызывает саму себя. Различают прямую и косвенную рекурсии. Функция называется прямо рекурсивной, если содержит в своем теле вызов самой себя. Если же функция вызывает другую функцию, которая в свою очередь вызывает первую, то такая функция называется косвенно рекурсивной.

Рассмотрим классические примеры использования рекурсии - реализацию операции возведения в степень и вычисление факториала числа. Заметим, что эти примеры являются классическими только из-за их удобства для объяснения понятия рекурсии, однако они не дают выигрыша в программной реализации по сравнению с итерационным способом решения этих задач.

<?
  function degree($x,$y)
  {
    if($y)
    {
      return $x*degree($x,$y-1);
    }
    return 1;
  }
  echo(degree(2,4)); // выводит 16
?>

Этот пример основан на том, что xy эквивалентно x*x(y-1). В этом коде задача вычисления 24 разбивается на вычисление 2*2³. Затем 2*2³ разбивается на 2*2² и так до тех пор, пока показатель не станет равным нулю.

Итерационный вариант этого примера выглядит так:

<?
  function degree($x,$y)
  {
    for($result = 1; $y > 0; --$y)
    {
      $result *= $x;
    }
    return $result;
  }
  echo(degree(2,4)); // выводит 16
?>

Кроме того, что этот код намного легче понять, он еще и более эффективен, поскольку проход цикла обходится "дешевле" вызова функции.

<?
  function fact($x)
  {
    if ($x < 0) return 0;
    if ($x == 0) return 1;
    return $x * fact($x - 1);
  }
  echo (fact(3)); // выводит 6
?>

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

k * (k - 1) * (k - 2) * ... * 3 * 2 * 1 * 1

Последовательность рекурсивных вызовов прерывается только при вызове fact(0), который и приводит к последнему значению 1 в произведении, так как последнее выражение, из которого вызывается функция, имеет вид 1 * fact(1 - 1).

Итерационно факториал можно вычислить так:

<?
  function fact($x)
  {
    for ($result = 1; $x > 1; --$x)
    {
      $result *= $x;
    }
    return $result;
  }
  echo (fact(6)); // выводит 720
?>

Назад | Содержание | Вперед



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru