Иногда это достаточно просто (если сам вызов - это последнее утверждение, это хвостовая рекурсия), но все же есть случаи, которые меня путают. Профессор сказал мне, что "если нет какой-либо инструкции для выполнения после самообзыскания, это рекурсия хвоста". Как насчет этих примеров (не обращайте внимания на то, что они не имеют большого смысла):
a) Это должно быть хвостом рекурсивным, видя, как самозапуск является последним утверждением, и после него ничего не осталось выполнить.
function foo(n)
{
    if(n == 0)
        return 0;
    else
        return foo(n-2);
}
b) Но как насчет этого? Это должен быть хвостовой вызов, потому что если условие истинно, ничего, кроме него, будет выполнено, но это не последнее утверждение?
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);
    }
}
