Иногда это достаточно просто (если сам вызов - это последнее утверждение, это хвостовая рекурсия), но все же есть случаи, которые меня путают. Профессор сказал мне, что "если нет какой-либо инструкции для выполнения после самообзыскания, это рекурсия хвоста". Как насчет этих примеров (не обращайте внимания на то, что они не имеют большого смысла):
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);
}
}