Wie erkennt man was ist und was nicht Schwanzrekursion?

Manchmal ist es einfach genug (wenn der Selbstaufruf die letzte Anweisung ist, ist es eine Schwanzrekursion), aber es gibt immer noch Fälle, die mich verwirren. Ein Professor sagte mir: "Wenn es nach dem Selbstaufruf keine Anweisung gibt, die ausgeführt werden könnte, ist dies eine Schwanzrekursion." Wie wäre es mit diesen Beispielen (ignorieren Sie die Tatsache, dass sie nicht viel Sinn ergeben):

a) Dieser sollte rekursiv sein, da der Selbstaufruf die letzte Anweisung ist und danach nichts mehr ausgeführt werden muss.

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

b) Aber wie wäre es mit diesem? Es sollte ein Tail-Aufruf sein, denn wenn die Bedingung wahr ist, wird nichts anderes ausgeführt, aber es ist nicht die letzte Anweisung?

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

c) Wie wäre es mit diesem? In beiden Fällen wird der Selbstaufruf zuletzt ausgeführt:

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

Antworten auf die Frage(8)

Ihre Antwort auf die Frage