Привет! Начал изучать php недавно. В одном из заданий курса нужно было написать функцию возведения числа в степень вида function($number, $power) используя рекурсию. В исходных материалах было похожее задание, только с факториалом. Механизм оттуда, но не совсем понимаю как это работает. Код (Text): <?php $num = 10; $inv = 4; function involve($num, $inv) { if($num === 0 && $$inv === 0) return 'Недопустимое значение основания и показателя степени'; elseif ($inv === 1) return $num; else return $num * involve($num, $inv - 1); } ?> Непонятно, что происходит когда $inv становится равной нулю (и не понятно становится ли). Что заставляет функцию прекращать выполнение и возвращать конечный результат? Интересен сам механизм работы интерпретатора.
Механизм такой: чтобы выход произошёл ты вместо запуска функции должен вернуть результат, тогда по цепочке вверх будет возвращён результат и дойдёт до верха и ты получишь данные которые вернула функция. Запусти отладку любой функции с рекурсией и посмотри в какой последовательности будет отрабатывать код. Отладка: https://netbeans.org/kb/docs/php/debugging_ru.html https://php.ru/forum/threads/howto-...i-po-shagam-i-s-kartinkami.58974/#post-474550
Поэтому $inv нулём не станет. Но не отработан случай, когда $inv изначально 0 (т.е. надо вернуть единицу)
интересный подход. функция глупа. думаю лучше так PHP: <?php function involve($num, $inv) { if ( (string)$inv !== (string)(int)$inv ) return 'Недопустимое значение показателя степени'; $inv = (int)$inv; if ( $inv < 0 ) return ($_=involve($num, -$inv))?1/$_:\INF; if ( $inv === 0 ) return 1; return $num * involve($num, $inv - 1); } foreach(range(-100,100,0.1) as $num) { foreach(range(-5,5,1) as $inv) { $n = involve($num, $inv); $o = pow($num, $inv); $r = abs($n - $o); if ( $n !== $o && $r > 0.00001 ) { echo "$num ^ $inv ; $n need $o ! $r :: error\n"; } } } http://sandbox.onlinephpfunctions.com/code/5e9e41e2f3e45f1a6766aa7bcf95191bddbd95a5 --- Добавлено --- возможны ошибки
foreach использовать не предполагается исходя из условий задачи, но все равно спасибо. Поясни пожалуйста что это: $_=involve($num, -$inv))?1/$_:\INF; в частности $_= и :\INF
@Donotstoptry, $_ - это просто имя переменной, поскольку она почти не используется, автор решил не давать ей осмысленное имя. ? : - это тернарный оператор Конструкция основана на том, что операция = (присвоение) в php, как и в C, возвращает присвоенное значение. Получается, что конструкция PHP: if ( $inv < 0 ) return ($_=involve($num, -$inv))?1/$_:\INF; отрабатывает возведение в отрицательную степень (x^(-n) = 1/ (x^n)). Сначала число возводится в аналогичную положительную степень involve($num, -$inv), записывается в переменную $_, и если в результате не 0 (т.е. истинное значение), то возвращается 1/$_, а если 0 - то бесконечность. Это всё симпатично, конечно, но ИМХО для учебной задачи - излишне. Вам таких условий не ставили.