PHP: Может кто-нибудь объяснить, как работает этот код? (Фибоначчи) - PullRequest
1 голос
/ 28 ноября 2009

Обещаю, это не домашняя работа. Я просто любопытный новичок.

Как это сделать:

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?

Ответы [ 5 ]

5 голосов
/ 28 ноября 2009

оператор "?" называется троичным оператором. Он используется как: p1? P2: p3 говорит, что если p1 истинно, то p2, иначе p3.

3 голосов
/ 28 ноября 2009

Там есть оператор if. Это называется троичный оператор .

condition ? if true : if false

Если $ i меньше 2, вернуть $ i, иначе вернуть f ($ i-1) + f ($ i-2). Я предполагаю, что рекурсивный вызов функции - это не то, что у вас возникают проблемы с пониманием, но, если это так, есть тонна примеров рекурсивного кода Фибоначчи, если вы заглянете в него.

3 голосов
/ 28 ноября 2009

Первая функция - сокращение. Вот что он делает

if($i < 2) { // $i < 2 ?
  return $i;
}
else { // :
  return f($i-1)+f($i-2);
}

Если меньше двух, функция не должна вызываться. Если оно равно 2 или больше, функция вызывается рекурсивно.

2 голосов
/ 28 ноября 2009
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) довольно много. больше.

2 голосов
/ 28 ноября 2009

Знак вопроса является условным выражением:

x ? a : b

оценивается как a, если x истинно, или b, если оно ложно.

...