2009-11-28 5 views
1

Je promets que ce n'est pas des devoirs. Je suis juste un novice curieux.PHP: Quelqu'un peut-il expliquer comment ce code fonctionne? (Fibonacci)

Comment ceci:

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

(écrit par quelqu'un d'intelligent)

produisent le même résultat que cette

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); 
} 

(le mien)

Je suppose que je viens de don pas la syntaxe. Y a-t-il une déclaration if dans ce document?

Répondre

5

L'opérateur "?" est appelé opérateur ternaire. Il est utilisé comme: p1? P2: p3 il indique si p1 est vrai, alors p2, sinon p3.

+1

Wow. C'est pratique. – Greg

2

La marque d'interrogation est une expression conditionnelle:

x ? a : b 

est évaluée à a si x est vrai, ou b si elle est fausse.

3

La première fonction est une forme abrégée. Voici ce qu'il fait

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

Si la valeur est inférieure à deux, la fonction n'a pas besoin d'être rappelée. Si elle vaut 2 ou plus, la fonction est appelée récursivement.

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

signifie

function f($i) 
{ 
    if $(i < 2) 
     return $i; 
    return f($i-1) + f($i-2); 
} 

C'est une expression directe de l'équation de Fibonacci.

L'autre fonction crée et utilise un cache de résultats générés: c'est une optimisation significative puisque l'évaluation de fib (4), par exemple, évaluerait fib (2) comme 3 ou 4 fois, et fib (1) tout à fait quelques autres.

+0

donc le code que j'ai écrit est réellement plus efficace? – Greg

+0

Oui! Essayez les deux fonctions sur F (100). –

3

Il existe une instruction if dans cet exemple. C'est ce qu'on appelle un ternary operator.

condition ? if true : if false 

Si i $ est inférieur à 2 $ i retour, sinon retour f ($ i-1) + f (i-2 $). Je suppose que l'appel de fonction récursif n'est pas ce que vous avez du mal à comprendre, mais si c'est il y a une tonne d'exemples de code fibonacci récursif si vous google pour cela.

Questions connexes