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