PHP:Может кто-нибудь объяснить, как работает этот код?(Фибоначчи)
Вопрос
Обещаю, это не домашнее задание.Я просто любопытный новичок.
Как это:
function f($i){return $i<2?$i:f($i-1)+f($i-2);}
(написано кем-то умным)
дает тот же результат, что и этот
function fibonacci($n, $arr = array(0,1)){
$arr[] = $arr[(count($arr) - 1)] + $arr[(count($arr) - 2)];
if (count($arr) == $n) return $arr[$n - 1];
else return fibonacci($n, $arr);
}
(мой)
Полагаю, я просто не понимаю синтаксиса.Есть ли там оператор if?
Решение
Оператор "?" называется тройным оператором.Он используется как:p1?p2:p3 говорит, что если p1 истинно, то p2, иначе p3.
Другие советы
Там есть оператор if.Это называется тернарный оператор.
condition ? if true : if false
Если $i меньше 2, верните $i, иначе верните f($i-1) + f($i-2).Я предполагаю, что рекурсивный вызов функции - это не то, что вам трудно понять, но если это так, то есть масса примеров рекурсивного кода Фибоначчи, если вы погуглите его.
Первая функция — сокращенная.Вот что он делает
if($i < 2) { // $i < 2 ?
return $i;
}
else { // :
return f($i-1)+f($i-2);
}
Если оно меньше двух, функцию не нужно вызывать.Если оно равно 2 или больше, функция вызывается рекурсивно.
Знак вопроса является условным выражением:
x ? a : b
оценивается как a
если x
верно, или b
если это ложь.
function f($i){return $i<2?$i:f($i-1)+f($i-2);}
означает
function f($i)
{
if $(i < 2)
return $i;
return f($i-1) + f($i-2);
}
Это прямое выражение уравнения Фибоначчи.
Другая функция создает и использует кеш сгенерированных результатов:это существенная оптимизация, поскольку при вычислении fib(4), например, в противном случае fib(2) будет оцениваться примерно 3 или 4 раза, а fib(1) еще несколько раз.