рекурсия

Работа функций и рекурсия

Статические переменные

Когда мы внутри функции определяем значение переменной — это локальная переменная.

function Test(){
   $a = 0;
   echo $a++;
}
Test(); //Выведет 0
Test(); //Выведет 0
Test(); //Выведет 0

Т.е. трижды вызвав функцию Test, получим три раза 0. Это локальные переменные, они живут то время, пока php внутри функции. Пока php не зашел в функцию, там ничего нет. Мы вызвали функцию, php зашел, создал переменную, присвоил ей значение 0. Ушел — все разрушил, ничего нет, переменная нигде не хранится.

Но иногда надо, чтобы php помнил значение переменной. Тогда объявляем переменную статической внутри функции (static $a =0;).

function Test(){
   static $a = 0;
   echo $a++;
}
Test(); //Выведет 0
Test(); //Выведет 1
Test(); //Выведет 2

Т.е. первый раз php зайдет, присвоит $a=0. Переменная увеличится на 1. Когда php выйдет, он порушит все, кроме этой функции (ВНИМАНИЕ! Эта функция не стала глобальной). Далее php зайдет снова в функцию, выведет 1, потом 2 и т.д.

Рекомендация. Не создавать слишком много глобальных переменных. Весь глобальный массив со всеми глобальными переменными хранится в памяти, уменьшая быстродействие. Происходит лишняя инициализация переменных, путаница в коде. Глобальная переменная должна использоваться везде, быть востребованной везде.

Возврат значений

Часто нужно, чтобы функция не что-то сделала и вывела конечный результат, а чтобы она вернула этот результат. А мы сами решим, что с ним делать.

function getSum($num1, $num2){
return $num1 + $num2; // функция возвращает значение
}
$result = getSum(10, 435); // вызов функции, считаем сумму
echo $result; // вывод результата

Return не только возвращает значение функции, но и заканчивает все внутри функции (т.е. грубо он еще работает и как break), и мы выходим из этой функции.

Рекурсивный вызов функций

Т.е. когда функция вызывает сама себя. Когда нужно сделать много действий с минимальными изменениями. Либо нужно сделать одно и тоже, но неопределенное число раз. Т.к. php не обнаруживает бесконечную рекурсию, то есть опасность, как в циклах, попасть в бесконечную рекурсию (зависнуть). Поэтому php нужно где-то остановить, нужен определенный код. См. пример ниже:

function factorial($n)
{
 if ($n == 0) return 1;
    return $n * factorial($n-1);
}
$result = factorial(5)
echo "5! = " . $result;

С рекурсией мы сталкиваемся постоянно. Например, архиваторы rar, zip, там внутри зашита рекурсия (им нужно зайти в папку => внутри еще папка => внутри еще папка). Дерево папок в Windows тоже отрисовывается с помощью рекурсии.




Добавить комментарий

Ваш e-mail не будет опубликован.