¿Cómo reconocer qué es y qué no es la recursión de la cola?

A veces es bastante simple (si la auto llamada es la última declaración, es una recursión de cola), pero todavía hay casos que me confunden. Un profesor me dijo que "si no hay instrucciones para ejecutar después de la auto-llamada, es una recursión de cola". ¿Qué tal estos ejemplos? (Sin tener en cuenta el hecho de que no tienen mucho sentido):

a) Este debe ser recursivo de cola, viendo cómo la auto-llamada es la última declaración, y no queda nada para ejecutar después.

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

b) ¿Pero qué tal este? Debería ser una llamada de cola, porque si la condición es verdadera, ¿nada excepto se ejecutará, pero no es la última declaración?

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

c) ¿Qué tal este? En ambos casos, la auto llamada será lo último que se ejecute:

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

Respuestas a la pregunta(4)

Su respuesta a la pregunta