Ваше понимание не совсем верно.Хвостовая рекурсия означает не «последний вызов сам по себе», а «последний вызов сам по себе».То есть хвостовой рекурсивный вызов должен быть последним действием, выполняемым функцией.Это должен быть «хвост» списка действий, которые функция выполняет над этим путем кода.(Конечно, должен быть путь к коду, который не включает рекурсивный вызов).
Также важно подумать о том, как оцениваются значения в выражении, а не в порядке их появления в коде.,Это выражение
1 + f(x + 1)
выполняется в следующем порядке:
tmp1 = x + 1
tmp2 = f(tmp1)
res = 1 + tmp2
или, альтернативно,
add(1, f(add(x, 1))
Записано так, как вы можете видеть, что вызов f
сопровождается другим действием, заключительным +
/ add
.Поскольку рекурсивный вызов не является последним действием, он не является хвостовой рекурсией.