Уроки PHP - урок 9 - Рекурсия
В прошлом уроке мы разобрали использование функций в PHP. А теперь еще немного углубимся в их использование. До этого урока мы разбирали функции такого вида:
<?php function myFunction(){ //определение функции } $x = myFunction(); //вызов функции ?>
Но что будет если вызвать функцию прямо в теле функции?
<?php function myFunction(){ $x = myFunction() ... return $x; } $y = myFunction();
Такой вызов функции в теле самой функции называется рекурсией. Это кажется довольно сложным в теории на практике все намного проще.
Давайте создадим функции расчета возведения числа в степень. Из курса алгебры вы наверно помните, что n степень числа обозначает это число перемноженное на себя n раз. На php это будет выглядеть так:
<?php function myDegree($x, $n){ if($n == 0){ return 1; } if($n < 0){ return myDegree( 1/$x, -$n); // -$n значит смену знака с отрицательного на положительный } return $x * myDegree($x, $n-1); // вызов функции внутри функции } $y = myDegree(2, -4); // самый первый вызов функции print $y; ?>
Давайте теперь разберем подробно эту функцию. Начнем с того что после строчки return функция больше не выполняется, а возвращает значение которое указано в return.
Первая конструкция if($n == 0) - если наша степень равна 0, то будет возвращена 1. Тут все понятно и просто степень числа 0, получите 1. Дальше, if($n < 0) - если мы задаем отрицательную степень, то мы делаем степень положительной, но при этом переворачиваем число возводимое в степень в дробь, опять же по определению степени так можно делать, чем мы и воспользовались.
Ну и последнее срабатывает если степень не равна 0 и не отрицательная, тогда мы вызываем нашу функцию при каждом уменьшение степени на 1, при этом каждый раз умножаем наше число на $x.
Давайте рассмотрим каждую итерацию (повторение) нашей функции:
1. Степень -4, число 2.
Здесь выполниться второй if, наше число станет дробным, а степень положительная.
2. Степень 4, число 0,5.
Степень положительная и не равна 0, поэтому мы проходим if и выполняется
return $x * myDegree($x, $n-1)
3. Степень 3, число 0,25.
4. Степень 2, число 0,125.
5. Степень 1, число 0,0625.
Здесь сработает первый if, то есть будет возвращена 1, эта 1 будет умножена на предыдущие результаты функций и больше рекурсий не будет.
Еще одни похожий пример факториал числа. Факториал числа n будет все перемноженные числа от 1 до n. То есть для числа 6 факториал будет равен 6*5*4*3*2*1 = 720. И как вы наверно догадались использовать мы будем рекурсию.
<?php function myRecursion($x){ if($x == 1){ return $x; } return $x*myRecursion($x-1); } $y = myRecursion(8); print $y; ?>
Этот пример еще проще, чем первый, поэтому я оставлю вам разобрать изменения параметров для функции myRecursion.