Как распознать, что является хвостовой рекурсией, а что нет?

Иногда это достаточно просто (если самовызов является последним утверждением, это хвостовая рекурсия), но все же есть случаи, которые меня смущают. Профессор сказал мне что «если нет инструкции для выполнения после самовызова, это хвостовая рекурсия». Как насчет этих примеров (не обращайте внимания на тот факт, что они не имеют особого смысла):

a) Этот должен быть хвостовой рекурсией, поскольку как самозвонок является последним утверждением, и после этого нечего казнить.

function foo(n)
{
    if(n == 0)
        return 0;
    else
        return foo(n-2);
}

б) А как насчет этого? Это должен быть хвостовой вызов, потому что, если условие истинно, ничего, кроме него, не будет выполняться, но это не последний оператор?

function foo(n)
{
    if(n != 0)
        return foo(n-2);
    else
        return 0;
}

c) Как насчет этого? В обоих случаях самовызов будет выполнен последним:

function foo(n)
{
    if(n == 0)
        return 0;
    else    
    {
        if(n > 100)
            return foo(n - 2);
        else
            return foo(n - 1);
    }
}
14
задан fingerprint211b 9 September 2010 в 16:32
поделиться