尾递归

普通的线性递归堆栈耗用大,比尾递归更加消耗资源,不过两者效率差不多。。。

举个栗子:递归求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