尾递归
普通的线性递归堆栈耗用大,比尾递归更加消耗资源,不过两者效率差不多。。。
举个栗子:递归求n的阶乘 1*2*...*n
// 普通线性递归
function recursive($n) {
if ($n > 1)
return recursive($n-1) * $n;
else
return 1;
}
// 尾递归,s代表乘积
function tailRecursive($n, $s = 1) {
if ($n > 1)
return tailRecursive($n-1, $s * $n);
else
return $s;
}
recursive(5); tailRecursive(5);
// 递归过程
--- 线性递归过程:
recursive(5)
{5 * recursive(4)}
{5 * {4 * recursive(3)}}
{5 * {4 * {3 * recursive(2)}}}
{5 * {4 * {3 * {2 * recursive(1)}}}}
{5 * {4 * {3 * {2 * 1}}}}
{5 * {4 * {3 * 2}}}
{5 * {4 * 6}}
{5 * 24}
120
--- 尾递归过程:
tailRecursive(5)
tailRecursive(4, 5)
tailRecursive(3, 20)
tailRecursive(2, 60)
tailRecursive(1, 120)
120