Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

Уроки PHP - урок 9 - Рекурсия

08/12/2019, by Ivan

В прошлом уроке мы разобрали использование функций в 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.