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

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

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

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;
}

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

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

Ответы на вопрос(4)

Ваш ответ на вопрос