这里有一个factorial
调用递归函数的函数fact
。递归函数总是这样工作:
如果你用“微不足道”的论点来称呼它,它可以立即给你答案。在您的代码中,这就是说的部分if($i<1){ return $j; }
(根据@Sreenath 的评论)
如果参数更“复杂”,则该函数会简化参数($i-1
在您的示例中:平凡的情况是$i<1
,因此$i
在某种程度上使参数变小会使参数更容易),然后使用更简单的参数和可能的一些附加信息调用自身,这是fact($i-1, $i*$j)
呼叫的来源。
所以fact
这里的递归函数可以做以下事情:
fact(i, j) = fact(i-1, i*j)
= fact(i-2, (i-1)*(i*j)) = fact(i-3, (i-2)*(i-1)*i*j)
= ... = fact(1, (i-(i-1)) * (i-(i-2)) * ... * (i-1) * i * j)
= fact(0, (i-i) * (i-(i-1)) * (i-(i-2)) * ... * (i-1) * i * j)
= (i-i) * (i-(i-1)) * (i-(i-2)) * ... * (i-1) * i * j # Because 0<1
= i! * j
现在如果你只想要阶乘,你需要调用fact
with1
作为第二个参数,就像你在return fact($n, 1);
.
function factorial($n){
if($n==0){ # The trivial case
return 1;
}
# Every other case is "complicated": call a specialized function.
return fact($n, 1);
}
function fact($i, $j){
# Helper function: returns i!*j, doing a recursive calculation.
if($i<1){ # The trivial case
return j; # i!*j for i<1 is just j
}
else { # The "complicated" case:
return fact(
$i-1, # Simplify the argument
$i*$j # Pass my current state down
); # And call myself with the simpler argument and the internal state.
}
}
# Test it: This should return 5!=120
echo factorial(5);